1、遇到现象
在构造函数中使用如下方法:发现对话框一闪而过,只显示myWidget类对话框。
2、原因
在构造函数中定义的变量,构造函数执行完,变量会自动释放。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
myWidget m;
m.show();
return a.exec();
}
myWidget::myWidget(QWidget *parent):QWidget(parent),ui(new Ui::myWidget)
{
ui->setupUi(this);
QDialog dialog(this);
dialog.show();
}
注意:这个区别于main()函数中,使用dialog.show()是可以持续存在的,这是因为a.exec()的存在,使程序进入消息循环,等待可能输入进行响应。这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
QDialog dialog;
dialog.show();
return a.exec();
}
3、解决方法1:使用new 指针的形式
//非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口进行交互,例如word中的查找替换对话框。
MainWindow::MainWindow(QWidget *parent):QWidget(parent),ui(new Ui::myWidget)
{
ui->setupUi(this);
QDialog *dialog = new QDialog(this);
//dialog->setModal(true);//添加这句后,对话框由非模态转换成模态
dialog->show();
}
new在堆空间创建了QDialog
4、解决方法2:使用exec()的形式
//模态对话框,在没有关闭前,不能再与同一个应用程序中的其他窗口进行交互,如新建项目时弹出的对话框,模态对话框相当于将主对话框阻塞住了。
MainWindow::MainWindow(QWidget *parent):QWidget(parent),ui(new Ui::myWidget)
{
ui->setupUi(this);
QDialog dialog(this);
dialog.exec();
}
这种方法只显示对话框,关闭对话框后,主窗口才会显示,
原因:同a.exc()一样,程序进入消息循环,等待可能输入进行响应,只有关闭dialog,exec执行完毕,MainWindow的构造函数才执行完成,主窗口显示。
5、总结:
1)调用show()函数会立即将控制权交给调用者,程序可以继续向下执行;
2)调用exec()函数,只有将对话框关闭时才会返回。
------>常用于警告框等。比如:不放在MainWindow构造函数中,而是在窗口中执行了某个操作,比方说点击了按钮后才弹出来,就不会影响到主窗口的显示,但此时只有将窗口关闭,程序才会继续执行。