Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在出现对话框时关闭主窗口_C++_Qt_Qt5_Qdialog - Fatal编程技术网

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

C++ 如何在出现对话框时关闭主窗口,c++,qt,qt5,qdialog,C++,Qt,Qt5,Qdialog,我正在做一个测试程序,其中主窗口用作登录屏幕。用户输入用户名和密码。如果它们与指定给字符串的内容匹配,则会出现对话框。如果失败,则会显示QMessageBox 我的问题是,当我希望对话框出现(主程序)时,我希望登录页面消失。命令close();我会关闭一切 以下是MainWindow.cpp的代码(该对话框在标题中作为名为mDialog的指针引用) 下面是main.cpp的代码 int main(int argc, char *argv[]) { QApplication a(argc, arg

我正在做一个测试程序,其中主窗口用作登录屏幕。用户输入用户名和密码。如果它们与指定给字符串的内容匹配,则会出现对话框。如果失败,则会显示QMessageBox

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

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

下面是main.cpp的代码

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

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

在Qt中,如果父参数
被销毁,子参数
也会被销毁,因此如果您将此作为参数转到
MyDialog
,它将被销毁。为了不被破坏,请不要传递父级

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

该函数看起来像:

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

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

主函数的伪代码(LoginDialog和MainDialog继承QDialog):


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


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

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

mainwindow.setVisible(false)

我也在想同样的事情,但由于某种原因,我无法让主页像对话框一样轻松打开,因为我可以将对话框作为指针传递。所以我试过了,这很有帮助。谢谢你的清楚解释!这种逻辑是有道理的。非常感谢!我不确定我做错了什么,但出于某种原因,main.cpp无法识别登录的布尔变量。我将对话框标题中的公共布尔值设置为false,当信息正确时,它将变为true。现在在main.cpp中,如图所示,LoginDialog*log=newlogindialog;日志->显示();如果(log->login==true){log->close();w.show();}我不确定为什么它没有识别出真正有意义的布尔变量。如果要这样做,反之亦然,让我们假设对话框是一个登录系统,并且主应用程序运行良好……主应用程序,是否也可以这样做?或者,只有当页面作为指针传递时,这种技术才会起作用吗?@JaoJao请更好地解释,否则最好的答案是尝试。是的,我意识到我的解释不是最好的。在询问之前,我将尝试setVisiblity()函数不存在,最相似的函数是可服务的({boolean})。它存在。此函数继承自
Qwidget
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();
mainwindow.setVisible(false)