想让一个Widget成为模态,我们只需要对其设置setAttribute(Qt::WA_ShowModal, true);
2017-04-11 23:06
736 查看
想让一个Widget成为模态,我们只需要对其设置:
注意:这是QWidget的成员函数 ,也就是说,QWidget可以显示为模态或非模态!
注意:该函数的参数取值:NonModal、WindowModal、ApplicationModal 分别对应默认情况下的
QDialog::show()
QDialog::open()
QDialog::exec()
如果你没有使用QDialog::open()的需求,你可能也不需要该函数。
不用解释了吧?我们要显示模态对话框,只需要类似下面的代码:
看到答案没:exec() 先设置modal属性,而后调用 show() 显示对话框,最后启用事件循环
用前面的 QDialog::exec() 一样,都是调用的 QEventLoop::exec()
而
进一步:这将调用平台相关的函数,比如在windows下
事件循环和线程没有必然的联系,事件循环可以用在QThread中,而且从Qt4.4开始,QThread的run函数默认就调用了自己的事件循环。
对与QDialog来说,当它自己的QEventLoop启用时,主程序的 QEventLoop 当然是处于暂停状态了。说到底,就是两个死循环,一个在内,一个在外,只有里面的退出后,外边的循环才会执行。不过由于两个循环执行的命令是基本一样的,都是调用并处理程序收到的各种事件,所以,可能变得不容易理解
http://doc.qt.io/qt-4.8/qwidget.html
setAttribute(Qt::WA_ShowModal, true);
注意:这是QWidget的成员函数 ,也就是说,QWidget可以显示为模态或非模态!
setWindowModality
除了直接调用setAttribute外,QWidget 提供了一个易用的函数,来设置窗体的模态。其源码如下:void QWidget::setWindowModality(Qt::WindowModality windowModality) { data->window_modality = windowModality; // setModal_sys() will be called by setAttribute() setAttribute(Qt::WA_ShowModal, (data->window_modality != Qt::NonModal)); setAttribute(Qt::WA_SetWindowModality, true); }
注意:该函数的参数取值:NonModal、WindowModal、ApplicationModal 分别对应默认情况下的
QDialog::show()
QDialog::open()
QDialog::exec()
如果你没有使用QDialog::open()的需求,你可能也不需要该函数。
setModal
除了QWidget提供的成员,QDialog 提供了 setModal 的成员函数,我们看看其代码:void QDialog::setModal(bool modal) { setAttribute(Qt::WA_ShowModal, modal); }
不用解释了吧?我们要显示模态对话框,只需要类似下面的代码:
QDialog * dlg = new QDialog(); dlg->setAttribute(Qt::WA_ShowModal, true); dlg->show();
exec()
有问题是不?为啥exec() 直接可以显示模态对话框呢?看QDialog源代码吧int QDialog::exec() { Q_D(QDialog); ... setAttribute(Qt::WA_ShowModal, true); ... show(); ... QEventLoop eventLoop; (void) eventLoop.exec(QEventLoop::DialogExec); ... }
看到答案没:exec() 先设置modal属性,而后调用 show() 显示对话框,最后启用事件循环
事件循环
Qt 程序时事件驱动的,每个程序,我们需要调用 QApplication::exec() 来启用事件循环。int QCoreApplication::exec() { ... QEventLoop eventLoop; int returnCode = eventLoop.exec(); ... return returnCode; }
用前面的 QDialog::exec() 一样,都是调用的 QEventLoop::exec()
int QEventLoop::exec(ProcessEventsFlags flags) { Q_D(QEventLoop); ... while (!d->exit) processEvents(flags | WaitForMoreEvents | EventLoopExec); ... return d->returnCode; }
而
bool QEventLoop::processEvents(ProcessEventsFlags flags) { Q_D(QEventLoop); if (!d->threadData->eventDispatcher) return false; if (flags & DeferredDeletion) QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); return d->threadData->eventDispatcher->processEvents(flags); }
进一步:这将调用平台相关的函数,比如在windows下
bool QGuiEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) { if (!QEventDispatcherWin32::processEvents(flags)) return false; if (configRequests) // any pending configs? qWinProcessConfigRequests(); return true; }
事件循环和线程没有必然的联系,事件循环可以用在QThread中,而且从Qt4.4开始,QThread的run函数默认就调用了自己的事件循环。
对与QDialog来说,当它自己的QEventLoop启用时,主程序的 QEventLoop 当然是处于暂停状态了。说到底,就是两个死循环,一个在内,一个在外,只有里面的退出后,外边的循环才会执行。不过由于两个循环执行的命令是基本一样的,都是调用并处理程序收到的各种事件,所以,可能变得不容易理解
http://doc.qt.io/qt-4.8/qwidget.html
相关文章推荐
- Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good
- qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新
- Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)
- 一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。 当一个Bloc
- QT 一个widget设置多个tooltips
- qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新
- QT:需要设置一个编译器来构建。在构建套件选项里设置一个编译器。
- QT -1: 错误:Qt Creator 需要设置一个编译器来构建。在构建套件选项里设置一个编译器。
- QT widget设置QT::FramelessWindowHint和Qt::WA_TranslucentBackground,会出现一个bug:在最小化还原时界面停止刷新
- 、首先,我们添加一个主界面窗体,命名为MainForm,该窗体IsMdiContainer设置为True,也就是设置为多文档窗体格式。拖拉布局控件"WeifenLuo.WinFormsUI.Docking.DockPanel"到主窗体MainForm中,并
- 上天总是带走他最珍爱的那个,却不管我们也需要他,一个平凡而伟大的程序员-Kervin
- 我们期待自己成为一个优秀的软件模型设计者
- 自动同步北京时间,需要启动jboss服务,然后运行127.0.0.1:8080即可,共两个jsp文件,一个获取时间,一个设置时间
- Discuz中设置广告的一个需要注意的地方
- 我们期待自己成为一个优秀的软件模型设计者(转载)
- 成为一个CTO需要具备什么条件?
- [导入](转贴)我们期待自己成为一个优秀的软件模型设计者,但是,要怎样做,又从哪里开始呢?
- (转贴)我们期待自己成为一个优秀的软件模型设计者,但是,要怎样做,又从哪里开始呢?
- 做为测试工程师,我们需要一个认证吗?
- 我们期待自己成为一个优秀的软件模型设计者,但是,要怎样做,又从哪里开始呢?