目录
前言
在使用 Qt 界面类时,QDialog 类自带 show() 和 exec() 方法,能够满足模态和非模态显示的要求,但是 QWidget 类只有 show() 方法,有时我们需要模态显示 QWidget 的对象(封装在界面库内),这时按以下方法调用可能无法满足要求(有可能界面只是一闪而过),这里介绍另外一种能够使窗口进行模态显示的方法。
QWidget* pWidget = new QWidget();
pWidget->setWindowFlags(Qt::FramelessWindowHint);//去除窗体边框
pWidget->setWindowModality(Qt::ApplicationModal);//设置窗体模态,要求该窗体没有父类,否则无效
pWidget->setGeometry(178, 178, 284, 132);
pWidget->show();
一、QEventLoop 类
1、简介
QEventLoop 类提供了进入和离开事件循环的方法。从 QDialog 的 exec() 源码可知,首先设置窗口属性为模态,然后显示窗口,最后开启事件循环,那么我们可以仿照 QDialog 的 exec() 函数完成 QWidget 的模态显示。
2、使用 Demo
Step 1:创建 QEventLoop 对象
Step 2:开启事件循环
Step 3:退出事件循环,释放创建的对象
//Step 1
QEventLoop *pEventLoop = new QEventLoop;
//Step 2
pEventLoop->exec();
//Step 3
pEventLoop->exit();
delete pEventLoop;
pEventLoop = NULL;
3、注意事项
一定要在析构函数中退出和释放(若是堆上创建)事件循环。
二、窗口模态实现方法
//在派生的 QWidget 类中添加成员 QEventLoop* m_EventLoop;
//在派生的构造函数中初始化 m_EventLoop = NULL;
//在派生的 QWidget 类中添加 int exec(); 函数,函数实现如下
int ClassName::exec()
{
this->setWindowModality(Qt::ApplicationModal);
this->show();
if(m_EventLoop == NULL)
{
m_EventLoop = new QEventLoop;
}
if(!m_EventLoop->isRunning())
m_EventLoop->exec();
return 0;
}
//在派生类的析构函数中退出事件循环,并释放内存
if(m_EventLoop != NULL)
{
m_EventLoop->exit();
delete m_EventLoop;
m_EventLoop = NULL;
}