在Qt中,我有一个带有插槽的类,称为on_pushButton_2_clicked(),在此函数中,我想实例化另一个类Login,并在其ui元素上运行setupUi

目前,这是我所拥有的:

在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();

}

最佳答案

在您的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();
}

10-07 19:29
查看更多