如何在出现对话框时关闭主 window
How to close the main window when a dialog appears
我正在制作一个测试程序,其中 MainWindow 用作登录屏幕。用户输入用户名和密码。如果它们与分配给字符串的内容相匹配,则会出现对话框。如果失败,则会出现 QMessageBox。
我的问题是当我希望对话框出现(主程序)时,我希望登录页面消失。命令关闭();只会关闭所有内容。
这是 MainWindow.cpp 的代码(对话框在 header 中被引用为一个名为 mDialog 的指针)
void MainWindow::on_pushButton_clicked()
{
if (ui->lineEdit->text() == username)
{
if (ui->lineEdit_2->text() == password)
{
//This is where the Dialog appears
mDialog= new MyDialog(this);
mDialog->show();
}
}
else if (ui->lineEdit->text() != username || ui->lineEdit->text() ==NULL)
{
if (ui->lineEdit_2->text() != password || ui->lineEdit_2->text() == NULL)
{
QMessageBox::warning(this, "Error", "The username or password is incorrect.");
}
}
}
这是 main.cpp
的代码
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
使用this->close()
关闭当前window,但在MyDialog的构造函数中,不要向构造函数传递任何内容。默认情况下,构造函数会将 0 传递给父参数,因此对话框将没有父参数。
在Qt中如果parent
被销毁,children
也会被销毁,所以如果你把this作为参数给MyDialog
,它也会被销毁。所以它不被销毁不传递父级。
将mDialog= new MyDialog(this)
更改为mDialog= new MyDialog()
并将close()
放在show()
之后。
函数看起来像:
...
mDialog= new QDialog();
mDialog->show();
close();
...
如果您的主程序是对话框,您可以在它显示之前打开带有 username/password 个字段的登录对话框。
main函数伪代码(LoginDialog和MainDialog继承QDialog):
QApplication a(argc, argv);
LoginDialog lDialog;
lDialog.exec(); // Modal dialog behavior. Stopped at this line while it not closed (QDialog::close())
if (lDialog.getUsername() != username || lDialog.getPassword() != password)
{
return 0;
}
MainDialog mDialog;
mDialog.show();
return a.exec();
我认为您应该将对话框显示为登录,将主 window 显示为主程序。如果登录成功,则显示 main window,而不是相反。关闭主 window 将关闭程序。
我已经完成了你想做的事情。您可以按照我上面所说的进行操作,或者另一种选择是使用 QLabel 在主 window 中创建登录屏幕。您可以将图像添加到 Qlabel(纯色图像或任何您喜欢的图像)并使其大小为 window 以阻止主程序的视图。然后您可以添加行编辑和按钮或任何您想要的内容。如果登录成功,可以关闭图像、标签和按钮以显示主程序。我使用正则表达式检查了输入。
您可以将 window 可见性设置为 false。
mainwindow.setVisible(false)
我正在制作一个测试程序,其中 MainWindow 用作登录屏幕。用户输入用户名和密码。如果它们与分配给字符串的内容相匹配,则会出现对话框。如果失败,则会出现 QMessageBox。
我的问题是当我希望对话框出现(主程序)时,我希望登录页面消失。命令关闭();只会关闭所有内容。
这是 MainWindow.cpp 的代码(对话框在 header 中被引用为一个名为 mDialog 的指针)
void MainWindow::on_pushButton_clicked()
{
if (ui->lineEdit->text() == username)
{
if (ui->lineEdit_2->text() == password)
{
//This is where the Dialog appears
mDialog= new MyDialog(this);
mDialog->show();
}
}
else if (ui->lineEdit->text() != username || ui->lineEdit->text() ==NULL)
{
if (ui->lineEdit_2->text() != password || ui->lineEdit_2->text() == NULL)
{
QMessageBox::warning(this, "Error", "The username or password is incorrect.");
}
}
}
这是 main.cpp
的代码int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
使用this->close()
关闭当前window,但在MyDialog的构造函数中,不要向构造函数传递任何内容。默认情况下,构造函数会将 0 传递给父参数,因此对话框将没有父参数。
在Qt中如果parent
被销毁,children
也会被销毁,所以如果你把this作为参数给MyDialog
,它也会被销毁。所以它不被销毁不传递父级。
将mDialog= new MyDialog(this)
更改为mDialog= new MyDialog()
并将close()
放在show()
之后。
函数看起来像:
...
mDialog= new QDialog();
mDialog->show();
close();
...
如果您的主程序是对话框,您可以在它显示之前打开带有 username/password 个字段的登录对话框。
main函数伪代码(LoginDialog和MainDialog继承QDialog):
QApplication a(argc, argv);
LoginDialog lDialog;
lDialog.exec(); // Modal dialog behavior. Stopped at this line while it not closed (QDialog::close())
if (lDialog.getUsername() != username || lDialog.getPassword() != password)
{
return 0;
}
MainDialog mDialog;
mDialog.show();
return a.exec();
我认为您应该将对话框显示为登录,将主 window 显示为主程序。如果登录成功,则显示 main window,而不是相反。关闭主 window 将关闭程序。
我已经完成了你想做的事情。您可以按照我上面所说的进行操作,或者另一种选择是使用 QLabel 在主 window 中创建登录屏幕。您可以将图像添加到 Qlabel(纯色图像或任何您喜欢的图像)并使其大小为 window 以阻止主程序的视图。然后您可以添加行编辑和按钮或任何您想要的内容。如果登录成功,可以关闭图像、标签和按钮以显示主程序。我使用正则表达式检查了输入。
您可以将 window 可见性设置为 false。
mainwindow.setVisible(false)