Qt:如何在出现C ++对话框时关闭主窗口

时间:2017-01-11 03:48:45

标签: c++ qt qt5 qdialog

所以我对Qt相当新,但不是C ++的新手(目前正在教自己Qt)。我正在制作一个测试程序,其中MainWindow用作登录屏幕。用户输入用户名和密码。如果它们与分配的字符串匹配,则会出现对话框。如果失败,则会出现QMessageBox。

当我想要显示对话框(主程序)时,我的问题是什么,我希望登录页面消失。命令close();只会关闭一切。 任何帮助或建议来解决这种情况或以不同的方式进行,将非常感激。

以下是MainWindow.cpp的代码(对话框在标题中引用为名为mDialog的POINTER)

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

同样,任何建议都有助于我更好地理解Qt。我不只是在寻找一个可靠的答案。

5 个答案:

答案 0 :(得分:4)

在Qt中,如果parent被销毁,children也会被销毁,所以如果你将其作为MyDialog的参数,它将被销毁。因此它不会被破坏而不会通过父母。

mDialog= new MyDialog(this)更改为mDialog= new MyDialog()并将close()放在show()之后。

该功能如下:

...
mDialog= new QDialog();
mDialog->show();
close();
...

答案 1 :(得分:3)

我认为您应该将对话框显示为登录名,将主窗口显示为主程序。如果登录成功,则显示主窗口,而不是相反。关闭主窗口将关闭程序。

我已经完成了你想要做的事情。您可以执行我上面所说的或另一个选项是使用QLabel在主窗口中创建登录屏幕。您可以将图像添加到Qlabel(纯色图像或任何您喜欢的图像),并使其大小为窗口大小以阻止主程序的视图。然后,您可以添加行编辑和按钮或任何您想要的。如果登录成功,可以关闭图像,标签和按钮以显示主程序。我使用正则表达式检查输入。

答案 2 :(得分:1)

使用this->close()关闭当前窗口,但在MyDialog的构造函数中,不要将任何内容传递给构造函数。默认情况下,构造函数将0传递给父参数,因此对话框将没有父对象。

答案 3 :(得分:0)

如果您的主程序是Dialog,您可以在显示之前打开包含用户名/密码字段的登录对话框。

主函数的伪代码(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();

答案 4 :(得分:0)

您可以将窗口可见性设置为false。

mainwindow.setVisible(false)