我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Qt怎么使用QDialog实现界面遮罩

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Qt怎么使用QDialog实现界面遮罩

这篇文章主要介绍了Qt怎么使用QDialog实现界面遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么使用QDialog实现界面遮罩文章都会有所收获,下面我们一起来看看吧。

先来看下效果:

Qt怎么使用QDialog实现界面遮罩

  • 根据需求功能,我们需要提供设置主窗口的接口,同样的,并不是说所有的窗口都需要进行遮罩,那么我们也同样需要知道哪些窗口是需要遮罩的,因此,还需要提供一个判断的标准,在一个工程里面,每个UI文件的objectName是独一份的,因此我们可以通过这些objectName来判断哪些dialog需要遮罩。

  • 该类是在需要被遮罩的dialog显示出来的时候自动调用显示,而不需要手动调用,因此需要检测全局的事件循环。

以上,我们来看下该组件的头文件定义:

#ifndef MASK_WIDGET_H#define MASK_WIDGET_H#include <QDialog>namespace Ui {    class MaskWidget;}class MaskWidget : public QDialog{    Q_OBJECT    Q_PROPERTY(QStringList names READ names WRITE setNames DESIGNABLE true)public:    static MaskWidget *instance();    void setMainWidget(QWidget* pWidget);        QStringList names() const; void setNames(const QStringList& names);protected:    bool eventFilter(QObject *obj, QEvent *event);private:    explicit MaskWidget(QWidget *parent = Q_NULLPTR);    ~MaskWidget();private:    Ui::MaskWidget* ui;       QStringList m_listName{ QStringList() };    QWidget* m_pMainWidget{ Q_NULLPTR };    static MaskWidget* m_pSelf;};#endif // MASK_WIDGET_H

由上面的类定义也能够看出来,这个组件还是比较简单的,简单到只有两个接口和一个事件过滤函数,所以下面,我们来具体看下其中的实现。

首先是千篇一律的单例实现,该组件在整个工程中独一份就好,多了可能就会出现你想不到的情况(多层覆盖或者冲突了):

MaskWidget * MaskWidget::m_pSelf = Q_NULLPTR;MaskWidget * MaskWidget::instance(){if (m_pSelf == Q_NULLPTR){m_pSelf = new MaskWidget;}return m_pSelf;}

在其构造中,我们需要设置一些window相关的属性,并且将该窗口先隐藏起来,要不然程序一打开就会看到整个上面有一层灰蒙蒙的遮罩。其实最主要的是需要在其构造函数里面注册事件过滤。

MaskWidget::MaskWidget(QWidget *parent) : QDialog(parent), ui(new Ui::MaskWidget){    ui->setupUi(this);    hide();    setWindowFlags(Qt::FramelessWindowHint | Qt::Tool |  Qt::WindowDoesNotAcceptFocus);    qApp->installEventFilter(this);}

在主程序启动之后,我们还要做两件事,也就是我们前面说的两个接口需要调用实现,一个是设置需要遮罩的主窗口,一个是需要设置弹出需要遮罩的窗口的名称,先看下设置主窗口。

void MaskWidget::setMainWidget(QWidget *pWidget){    this->setFixedSize(QSize(pWidget->width(), pWidget->height()));    this->setParent(pWidget);    this->move(pWidget->x(), pWidget->y());}

由上面可以看出,设置主窗口之后,我们将该组件的父类也设置为了主窗口,这样就能保证该组件显示出来的时候一定是以设置的主窗口为父节点进行显示,并且能够铺满整个主窗口。

显示窗口的设置也是比较简单的属性的操作方式,如下:

void MaskWidget::setNames(const QStringList& names){     if(m_listName == names)     {         return;     }     m_listName = names; } QStringList MaskWidget::names() const {     return names; }

在整个过程中,其实最主要的是事件过滤函数的实现,该函数基本包含了该组件的基本功能,下面我们看下该函数的实现。

bool MaskWidget::eventFilter(QObject *obj, QEvent *event){    if(event->type() == QEvent::Hide)    {        if(m_listName.contains(obj->objectName()))        {            hide();        }        return QObject::eventFilter(obj, event);    }    if (event->type() == QEvent::Show)     {        if (!m_listName.contains(obj->objectName()))        {            return QObject::eventFilter(obj, event);        }        show();        auto pWidget = dynamic_cast<QWidget*>(obj);     //将object转换为普通QWidget        if (Q_NULLPTR == pWidget)        {            return QObject::eventFilter(obj, event);        }        pWidget->activateWindow();        pWidget->setFocus(Qt::ActiveWindowFocusReason);        stackUnder(pWidget);    //将该窗口设置放到弹窗的下面        if(Q_NULLPTR == m_pMainWidget)        {            return QObject::eventFilter(obj, event);        }        m_pMainWidget->stackUnder(this);    //将主窗口设置放到该组件界面下方,就能够有一个比较清晰的层次关系        //下面是实现将弹窗的位置移动到主程序的正中间,在这边实现的目的是为了减少代码量,毕竟写代码能偷的懒还是一定要偷的        QRect screenGeometry = m_pMainWidget->geometry();        int x = screenGeometry.x() + (screenGeometry.width() - pWidget->width()) / 2;        int y = screenGeometry.y() + (screenGeometry.height() - pWidget->height()) / 2;        pWidget->move(x, y);    }     return QObject::eventFilter(obj, event);}

以上,该组件的全部功能介绍完了。

使用的过程中了,直接包含文件就能够使用,需要注意的是,弹出的dialog窗口的基类必须QDialog,并且在调用时使用QDialog::exec()函数实现模态。如果不实现模态的话,会出现一些意外,当然这些意外并不影响使用,只是交互上面会比较不友好。假设你的主程序不能移动,那么就会很不友好。

TestDialog dlg;if(QDialog::Accept == dlg.exec()){}

关于“Qt怎么使用QDialog实现界面遮罩”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Qt怎么使用QDialog实现界面遮罩”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Qt怎么使用QDialog实现界面遮罩

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Qt怎么使用QDialog实现界面遮罩

这篇文章主要介绍了Qt怎么使用QDialog实现界面遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么使用QDialog实现界面遮罩文章都会有所收获,下面我们一起来看看吧。先来看下效果:根据需求功能,我
2023-06-30

怎么用jquery+CSS实现悬浮登录框遮罩

这篇文章主要介绍了怎么用jquery+CSS实现悬浮登录框遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用jquery+CSS实现悬浮登录框遮罩文章都会有所收获,下面我们一起来看看吧。先上效果图,阴影部
2023-06-29

怎么使用qt做登录界面

要使用Qt来制作登录界面,可以按照以下步骤进行操作:1. 打开Qt Creator,创建一个新的Qt项目。2. 在项目中创建一个新的窗口,用于登录界面。3. 在登录窗口中添加所需的控件,例如用户名输入框、密码输入框、登录按钮等。4. 使用布
2023-08-09

MFC程序中使用QT开发界面的实现步骤是什么

MFC程序中使用QT开发界面的实现步骤是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如果你有一个现成的MFC项目在做维护,但是你厌倦了使用MFC繁琐的操作来做界面美化,或
2023-06-25

Android怎么使用RecyclerView实现瀑布流界面

今天小编给大家分享一下Android怎么使用RecyclerView实现瀑布流界面的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下
2023-07-05

JAVA中怎么使用swing实现炫酷界面

要使用Swing实现炫酷的界面,你可以考虑以下几点:1. 使用不同的布局管理器:Swing提供了多种布局管理器,如BorderLayout、GridLayout和FlowLayout等。你可以根据需要选择合适的布局管理器来实现不同的界面效果
2023-08-26

怎么使用ThinkPHP实现文章添加界面

本篇内容介绍了“怎么使用ThinkPHP实现文章添加界面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、创建数据库首先,我们需要为我们的文
2023-07-05

使用Qt怎么实现进度条

本篇文章为大家展示了使用Qt怎么实现进度条,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、前言  有时我们需要在表格(QTableWidget)、树状栏(QTreeWidget)中直观显示任务进度
2023-06-15

使用PYQT5怎么实现一个界面嵌套功能

这篇文章给大家介绍使用PYQT5怎么实现一个界面嵌套功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。简单演示下:首先主界面界面:在Form处设置下水平布局,就如下图:左右两侧分别是一个frame控件,左侧frame里
2023-06-08

怎么在Android中使用Kotlin实现一个登录界面

怎么在Android中使用Kotlin实现一个登录界面?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。登录界面代码如下:class LoginActivity :
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录