在Qt中,我有一个具有插槽的类,称为on_pushButton_2_clicked(),在此函数中,我想实例化另一个类Login
,并在其ui元素上运行setupUi
。
目前,这是我的:
在WelcomeScreen.cppvoid 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.cppvoid 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();
}