Qt中模态对话框和非模态对话框的区别

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构造函数中,而是在窗口中执行了某个操作,比方说点击了按钮后才弹出来,就不会影响到主窗口的显示,但此时只有将窗口关闭,程序才会继续执行。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值