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