骚操作:QWidget模态显示(使用事件循环)

目录

前言

一、QEventLoop 类

1、简介

2、使用 Demo

        Step 1:创建 QEventLoop 对象

        Step 2:开启事件循环

        Step 3:退出事件循环,释放创建的对象

3、注意事项

二、窗口模态实现方法  


前言

在使用 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖晴的天

予人玫瑰,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值