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