C ++和Qt,我如何运行构造函数或对象创建的不同函数来设置Ui?

时间:2014-03-19 13:03:00

标签: c++ qt qt5 qt-designer

在Qt中,我有一个带有槽的类,名为on_pushButton_2_clicked(),在这个函数中,我想实例化另一个类Login,并在其ui元素上运行setupUi。 / p>

目前,这就是我所拥有的:

在WelcomeScreen.cpp中

void WelcomeScreen::on_pushButton_2_clicked()
{
    Login login(this);
    login.init();
}

并在Login.cpp中

void Login::init(){
    ui->setupUi(this);

    QPalette wPal(palette());
    wPal.setColor(QPalette::Background,Qt::white);
    ui->success->setAutoFillBackground(true);
    ui->success->setPalette(wPal);
    ui->success->hide();
    ui->failure->setAutoFillBackground(true);
    ui->failure->setPalette(wPal);
    ui->failure->hide();
}

这个编译并运行正常,但是按下按钮时它不会加载登录ui。这确实加载了UI:

在WelcomeScreen.cpp

void WelcomeScreen::on_pushButton_2_clicked()
{
    Ui::Login login_ui;
    login_ui.setupUi(this);
}

但是,它不运行Login构造函数或其任何函数,因此我无法像我想的那样初始化它。

理想情况下,我想简单地实例化Login对象并让它运行构造函数,从而设置Ui并运行所有初始化。

此外,这是Login构造函数(它基本上是默认构造函数)

Login::Login(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Login)
{
init();

}

1 个答案:

答案 0 :(得分:2)

WelcomeScreen::on_pushButton_2_clicked()函数中,一旦函数完成,您的Login对象将被销毁。这是因为它超出了范围。您可以通过使用new初始化它或将其作为成员变量来解决此问题。您也可以使用QSharedPointer或类似的类。

我不知道你的Login课程应该如何工作,所以在我的例子中,我会在关闭时删除它。

void WelcomeScreen::on_pushButton_2_clicked()
{
    Login *login = new Login(this);
    login->setAttribute(Qt::WA_DeleteOnClose);
    login->init();
}