返回顶部
首页 > 资讯 > 精选 >Qt怎么使用QDialog实现界面遮罩
  • 165
分享到

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

2023-06-30 11:06:07 165人浏览 八月长安
摘要

这篇文章主要介绍了Qt怎么使用QDialog实现界面遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇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实现界面遮罩”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Qt怎么使用QDialog实现界面遮罩

本文链接: https://lsjlt.com/news/328461.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Qt怎么使用QDialog实现界面遮罩
    这篇文章主要介绍了Qt怎么使用QDialog实现界面遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么使用QDialog实现界面遮罩文章都会有所收获,下面我们一起来看看吧。先来看下效果:根据需求功能,我...
    99+
    2023-06-30
  • Qt使用QDialog实现界面遮罩的示例(蒙版)
    写应用程序的过程中,弹窗是个避免不了的功能,显示中,假设弹窗背景色和主窗口背景色相差不多,甚至是一样的时候,就会存在一个比较严重的人机交互和UI显示的问题,找到弹窗的边界是比较麻烦的...
    99+
    2024-04-02
  • 遮罩层+Iframe如何实现界面自动显示
    这篇文章给大家分享的是有关遮罩层+Iframe如何实现界面自动显示的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果在教师评阅作业时,先把学生的作业展现出来,然后关掉界面进行评分(用百度主页做演示)Iframei...
    99+
    2023-06-09
  • 怎么用js+css实现div遮罩层效果
    本篇内容主要讲解“怎么用js+css实现div遮罩层效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用js+css实现div遮罩层效果”吧!<sty...
    99+
    2024-04-02
  • 怎么用jquery+CSS实现悬浮登录框遮罩
    这篇文章主要介绍了怎么用jquery+CSS实现悬浮登录框遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用jquery+CSS实现悬浮登录框遮罩文章都会有所收获,下面我们一起来看看吧。先上效果图,阴影部...
    99+
    2023-06-29
  • 微信小程序怎么实现遮罩功能
    本文小编为大家详细介绍“微信小程序怎么实现遮罩功能  ”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序怎么实现遮罩功能  ”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。微信小程序实现...
    99+
    2023-06-26
  • 怎么使用CSS实现中间镂空的图片遮罩效果
    这篇文章主要讲解了“怎么使用CSS实现中间镂空的图片遮罩效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用CSS实现中间镂空的图片遮罩效果”吧!中间...
    99+
    2024-04-02
  • 怎么使用qt做登录界面
    要使用Qt来制作登录界面,可以按照以下步骤进行操作:1. 打开Qt Creator,创建一个新的Qt项目。2. 在项目中创建一个新的...
    99+
    2023-08-09
    qt
  • HTML5怎么实现动态文字遮罩背景特效
    这篇文章主要介绍“HTML5怎么实现动态文字遮罩背景特效”,在日常操作中,相信很多人在HTML5怎么实现动态文字遮罩背景特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HT...
    99+
    2024-04-02
  • 怎么在css中实现遮罩全屏居中对齐
    这篇文章将为大家详细讲解有关怎么在css中实现遮罩全屏居中对齐,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体代码如下所示:<style>#toastLoaderFullScr...
    99+
    2023-06-08
  • 如何使用MASK实现视频弹幕人物遮罩过滤
    这篇文章将为大家详细讲解有关如何使用MASK实现视频弹幕人物遮罩过滤,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简单的一个截图例子: 其实,这里是运用了 CS...
    99+
    2024-04-02
  • 如何使用HTML和CSS实现一个全屏遮罩布局
    首先,让我们来创建HTML结构。在HTML文件中,我们会使用一个div元素来作为遮罩的容器,并在其中添加内容,如下所示:<!DOCTYPE html> <html> <head> <meta...
    99+
    2023-10-21
    HTML布局 CSS实现 全屏遮罩
  • 使用css3怎么给背景图片加颜色遮罩
    这篇文章给大家介绍使用css3怎么给背景图片加颜色遮罩,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。方法一:通过定位叠加(注意层级)<div class="wrap1">&nb...
    99+
    2023-06-08
  • 怎么用css3实现图片遮罩效果鼠标hover以后出现文字
    本篇内容介绍了“怎么用css3实现图片遮罩效果鼠标hover以后出现文字”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • MFC程序中使用QT开发界面的实现步骤
    目录添加QT依赖添加信号槽机制添加qt界面配置元编译过程一些问题的处理测试信号槽使用qt designer 设计界面如果你有一个现成的MFC项目在做维护,但是你厌倦了使用MFC繁琐的...
    99+
    2024-04-02
  • 怎么用纯css3实现图片点击弹出动画遮罩层效果
    本文小编为大家详细介绍“怎么用纯css3实现图片点击弹出动画遮罩层效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用纯css3实现图片点击弹出动画遮罩层效果”文章能帮助大家解决疑惑,下面跟着小编的思...
    99+
    2024-04-02
  • jQuery怎么实现单击按钮遮罩弹出对话框效果
    这篇文章主要介绍jQuery怎么实现单击按钮遮罩弹出对话框效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!主要用到了:/jquery-1.10.2.min.js代码如下:<h...
    99+
    2024-04-02
  • 教你如何使用qt quick-PathView实现好看的home界面
    PathView ,顾名思义,沿着特定的路径显示 Model 内的数据。 Model 能够是 QML 内建的 ListModel 、 XmlListModel ,也能够是在 C++ ...
    99+
    2024-04-02
  • MFC程序中使用QT开发界面的实现步骤是什么
    MFC程序中使用QT开发界面的实现步骤是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如果你有一个现成的MFC项目在做维护,但是你厌倦了使用MFC繁琐的操作来做界面美化,或...
    99+
    2023-06-25
  • 微信小程序怎么实现弹出和隐藏遮罩层动画
    这篇文章主要介绍“微信小程序怎么实现弹出和隐藏遮罩层动画”,在日常操作中,相信很多人在微信小程序怎么实现弹出和隐藏遮罩层动画问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”微信小程序怎么实现弹出和隐藏遮罩层动画...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作