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



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

最新更新