出现对话框时如何关闭主窗口

Posted

技术标签:

【中文标题】出现对话框时如何关闭主窗口【英文标题】:How to close the main window when a dialog appears 【发布时间】:2017-01-11 03:48:44 【问题描述】:

我正在制作一个测试程序,其中 MainWindow 用作登录屏幕。用户输入用户名和密码。如果它们与分配的字符串匹配,则会出现对话框。如果失败,则会出现一个 QMessageBox。

我的问题是当我希望对话框出现(主程序)时,我希望登录页面消失。命令关闭();只会关闭一切。

这是 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();

【问题讨论】:

【参考方案1】:

在Qt中如果parent被销毁,children也一样,所以如果你把这个作为MyDialog的参数,它就会被销毁。这样它就不会被破坏,不要传递父级。

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

函数如下所示:

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

【讨论】:

这实际上是有道理的。如果反之亦然,假设对话框是一个登录系统并且主应用程序运行良好......主应用程序,它可以以同样的方式完成吗?或者这种技术只有在页面作为指针传递时才有效? @JaoJao 请解释清楚,否则最好的答案是尝试。 是的,我意识到我的解释并不是最好的。我会在询问之前尝试【参考方案2】:

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

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

【讨论】:

我也在想同样的事情,但由于某种原因,我无法像对话框那样简单地打开主页,因为我可以将对话框作为指针传递。所以我反过来尝试了【参考方案3】:

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

【讨论】:

这很有帮助。感谢您的清晰解释!【参考方案4】:

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

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

【讨论】:

逻辑是有道理的。真的很感激! 我不确定我做错了什么,但由于某种原因,main.cpp 无法识别登录的布尔变量。我将对话框标题中的公共布尔值设置为 false,当信息正确时,它变为 true。现在在 main.cpp 中,如图所示 LoginDialog *log = new LoginDialog;日志->显示(); if (log->login == true) log->close(); w.show();我不确定为什么它不能识别布尔变量【参考方案5】:

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

mainwindow.setVisible(false)

【讨论】:

setVisiblity()函数不存在,最相似的函数是serVisible(boolean)。 存在。这个函数继承自Qwidget

以上是关于出现对话框时如何关闭主窗口的主要内容,如果未能解决你的问题,请参考以下文章

关闭对话框后如何触发方法

Qt 编写多窗口程序

在 Linux/X11 上的 Qt 中,如何解决主窗口排序问题?

Qt 中的主应用程序窗口和对话交互

VC/MFC 对话框工程中 主窗体与子窗体之间如何传值?

QtQt窗口程序