Qt 模态窗口和非模态窗口

项目中要用到非模态窗口,程序一开始弹出一个主窗口来,点击一个按钮的时候弹出一个非模态窗口,虽然是一个比较简单的需求,但是在实现的过程中有各种问题。列一下自己遇到的问题并且说一下自己的解决方法。

1) 弹出的非模态窗口始终躲在最后面,并且非模态窗口上的控件不能操作。

     主窗口是一个模态的窗口,非模态窗口在初始化的时候没有把主窗口作为他的父窗口。所以弹出来的非模态窗口就始终躲在最后面。  

CModealDlg*dlg = new CModealDlg(this); //this 指针是主窗口的指针. 
dlg->setModal(false);

dlg->show();  //一定要调用show 函数,不能是exec 函数

     这种弹出的非模态窗口类似find 窗口,始终在主窗口的前面
2) 弹出的非模态窗口和主窗口不能随意切换

         弹出非模态窗口之后,如果点击主窗口的话,这个时候应该是主窗口显示在最前面,也就是说点哪个窗口哪个就应该在最前面。这个主要是因为你的主窗口是模态导致的。所以需要把主窗口设置为非模态。并且弹出的窗口不能设置父窗口。 

     CModealDlg*dlg = new CModealDlg(); //构造的时候不能带this 指针. 

dlg->setModal(false);

dlg->show();  //一定要调用show 函数,不能是exec 函数

3)  窗口之间的通信使用信号和槽。 这个比较简单

      非模态窗口声明一个信号。然后再创建非模态窗口的时候connect 这个信号就可以了

    1) 声明信号

2) 在必要的地方触发信号

     3)   连接信号

        CModealDlg*dlg = new CModealDlg();

connect(dlg, SIGNAL(Frush(bool)), this, SLOT(OnTmpFrush(bool)));

/**************************************

QDialog是各种对话框的基类,其继承自QWidget,对话框有两种表现形式:模态对话框、非模态对话框。

模态对话框:模态对话框就是阻塞同一应用程序中其它可视窗口的输入的对话框。用户必须完成当前对话框中的交互操作并且关闭窗口后才能操作应用程序中的其它窗口。模态对话框有它们自己的本地事件循环。exec()方法可使窗口以模态方式运行。当用户关闭这个对话框,exec()将提供一个可用的返回值并且这时流程控制继续从调用exec()的地方进行。通常,我们连接默认按钮,例如“OK”到accept()槽并且把“Cancel”连接到reject()槽,来使对话框关闭并且返回适当的值。另外我们也可以连接done()槽,传递给它Accepted或Rejected。

非模态对话框:当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。非模态对话框(Modeless Dialog)的概念是一个概念,不仅仅Qt中具有,在其他不同的平台下 也都存在。但是叫法可能有区别,例如模式对话框,无模式对话框等。

模态窗口运行:

(1)调用exec()方法,如

QDialog dlg;

dlg.exec();

(2)调用setModal()方法设置模态,如

QDialog dlg;

dlg.setModal(true);

dlg.show();

(3)setWindowModality() 方法

QWidget widget;

widget.setWindowModality(Qt::ApplicationModal);                             

widget.show();

阻塞方式

阻塞效果

Qt::ApplicationModal

阻塞应用程序的所有窗口

Qt::WindowModal

阻塞阻塞父窗口、祖先窗口及它们的子窗口

Qt::NoModal

不阻塞,默认值

/**************************
2.Qt有两种方法可以实现模态窗口:
(1)使用QDialog窗口->exec(); //阻塞整个程序所有窗口
(2)使用setModal()函数来实现; //阻塞整个程序所有窗口
(3)使用setWindowModality(Qt::ApplicationModal);//阻塞整个窗口

示例代码:
//方法一
//绑定父指针后此指针不需要delete
ModelDialog *model = new ModelDialog(this);
//设置窗口状态为模态窗口
model->setModal(true);
model->show();

//方法二
ModelDialog *model = new ModelDialog(this);
model->exec();

//方法三 《在即将显示窗口的构造中进行设置即可》
setWindowModality(Qt::NonModal);            //不阻塞任何窗口
setWindowModality(Qt::ApplicationModal);    //阻塞整个窗口

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值