Qt, сбой, когда кнопка QStackedWidget пытается получить доступ к метке другого QStackedWidget

Main создает два QStackedWidget, класс Body и класс Bottom. В классе Body есть кнопка, и при ее нажатии она должна изменить текст в метке снизу. Сбой программы, когда кнопка Body-> пытается использовать открытую функцию Bottom, которая изменяет частную метку.

main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //GRAPHIC INTERFACE
    QStackedWidget *stackedWidget_body = new QStackedWidget;
    QStackedWidget *stackedWidget_bottom = new QStackedWidget;

    //create classe
    Body    * wBody ;
    Bottom  *wBottom;
    wBody = new Body(wBottom); //pass the reference of the Bottom class, wBottom
    wBottom = new Bottom();
    //wBottom->setLLabel();  //this command will change the name of the label, it means that setLLabel works well

    //insert the body widget
    stackedWidget_body->addWidget(wBody);
    //insert the bottom widget
    stackedWidget_bottom->addWidget(wBottom);

    //layout
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(stackedWidget_body);
    layout->addWidget(stackedWidget_bottom);

    //WINDOW
    QWidget window;
    window.setLayout(layout);
    window.show();

    a.exec();
    return 0 ;
}

Body.h

namespace Ui {
class Body;
}

class Body : public QWidget
{
    Q_OBJECT

public:
    explicit Body(Bottom  *_wBottom, QWidget *parent = 0);
    ~Body();

  public slots:
    void test();   // it will be called then the button will be pressed

private:
    Ui::Body *ui;
    Bottom  *wBottom;
    void testSend(Bottom  *wBottom);
};

Body.cpp

Body::Body(Bottom  *_wBottom, QWidget *parent) :
    wBottom(_wBottom),
    QWidget(parent),
    ui(new Ui::Body)
{
    QPushButton *button_standard2 = new QPushButton("test");
    connect(button_standard2, SIGNAL(clicked(bool)),this, SLOT(test()));
    //layout
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(button_standard2);
    this->setLayout(layout);
    ui->setupUi(this);
}

Body::~Body()
{delete ui;}

void Body::test(){
 testSend(wBottom);
}

void Body::testSend(Bottom  *wBottomX)
{
wBottomX->setLLabel();
}

bottom.h

namespace Ui {
class Bottom;
}

class Bottom : public QWidget
{
    Q_OBJECT

public:
    explicit Bottom(QWidget *parent = 0);
    ~Bottom();
    void setLLabel();

private:
    Ui::Bottom *ui;
    QLabel *bLabel;
};

bottom.cpp

Bottom::Bottom(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Bottom)
{
    bLabel = new QLabel("Name");

    //layout
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(bLabel);
    //setLLabel();  //this functions does it work
    this->setLayout(layout);
    ui->setupUi(this);
}

Bottom::~Bottom()
{delete ui;}

void Bottom::setLLabel(){
std::cout<<"change";
Bottom::bLabel->setText("value");  //The problem is here, when the function is called from Body::testSend
}

Можете ли вы дать мне какой-нибудь совет?

1 ответ

//create classe
Body    * wBody ;
Bottom  *wBottom;
wBody = new Body(wBottom); //pass the reference of the Bottom class, wBottom
wBottom = new Bottom();

Вы отправляете недействительный wBottom экземпляр для wBody, Попробуйте поменять последние две строки.

Другие вопросы по тегам