广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/328461.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Qt怎么使用QDialog实现界面遮罩
    这篇文章主要介绍了Qt怎么使用QDialog实现界面遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么使用QDialog实现界面遮罩文章都会有所收获,下面我们一起来看看吧。先来看下效果:根据需求功能,我...
    99+
    2023-06-30
  • Qt使用QDialog实现界面遮罩的示例(蒙版)
    写应用程序的过程中,弹窗是个避免不了的功能,显示中,假设弹窗背景色和主窗口背景色相差不多,甚至是一样的时候,就会存在一个比较严重的人机交互和UI显示的问题,找到弹窗的边界是比较麻烦的...
    99+
    2022-11-13
  • 怎么用js+css实现div遮罩层效果
    本篇内容主要讲解“怎么用js+css实现div遮罩层效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用js+css实现div遮罩层效果”吧!<sty...
    99+
    2022-10-19
  • 怎么用jquery+CSS实现悬浮登录框遮罩
    这篇文章主要介绍了怎么用jquery+CSS实现悬浮登录框遮罩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用jquery+CSS实现悬浮登录框遮罩文章都会有所收获,下面我们一起来看看吧。先上效果图,阴影部...
    99+
    2023-06-29
  • 怎么使用CSS实现中间镂空的图片遮罩效果
    这篇文章主要讲解了“怎么使用CSS实现中间镂空的图片遮罩效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用CSS实现中间镂空的图片遮罩效果”吧!中间...
    99+
    2022-10-19
  • 怎么使用qt做登录界面
    要使用Qt来制作登录界面,可以按照以下步骤进行操作:1. 打开Qt Creator,创建一个新的Qt项目。2. 在项目中创建一个新的...
    99+
    2023-08-09
    qt
  • 怎么用css3实现图片遮罩效果鼠标hover以后出现文字
    本篇内容介绍了“怎么用css3实现图片遮罩效果鼠标hover以后出现文字”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2022-10-19
  • 怎么用纯css3实现图片点击弹出动画遮罩层效果
    本文小编为大家详细介绍“怎么用纯css3实现图片点击弹出动画遮罩层效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用纯css3实现图片点击弹出动画遮罩层效果”文章能帮助大家解决疑惑,下面跟着小编的思...
    99+
    2022-10-19
  • MFC程序中使用QT开发界面的实现步骤
    目录添加QT依赖添加信号槽机制添加qt界面配置元编译过程一些问题的处理测试信号槽使用qt designer 设计界面如果你有一个现成的MFC项目在做维护,但是你厌倦了使用MFC繁琐的...
    99+
    2022-11-12
  • MFC程序中使用QT开发界面的实现步骤是什么
    MFC程序中使用QT开发界面的实现步骤是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如果你有一个现成的MFC项目在做维护,但是你厌倦了使用MFC繁琐的操作来做界面美化,或...
    99+
    2023-06-25
  • 教你如何使用qt quick-PathView实现好看的home界面
    PathView ,顾名思义,沿着特定的路径显示 Model 内的数据。 Model 能够是 QML 内建的 ListModel 、 XmlListModel ,也能够是在 C++ ...
    99+
    2022-11-12
  • IDA Pro 6.0使用Qt框架实现了跨平台的UI界面
    IDA Pro 6.0使用Qt 框架实现了跨平台的UI。它的好处是插件编写者还可以直接使用 Qt 开发跨平台 UI。但是编剧呢? 在这篇博文中,我们将说明如何使用PySide使用ID...
    99+
    2022-11-12
  • 怎么使用ThinkPHP实现文章添加界面
    本篇内容介绍了“怎么使用ThinkPHP实现文章添加界面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、创建数据库首先,我们需要为我们的文...
    99+
    2023-07-05
  • Android怎么使用RecyclerView实现瀑布流界面
    今天小编给大家分享一下Android怎么使用RecyclerView实现瀑布流界面的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • JAVA中怎么使用swing实现炫酷界面
    要使用Swing实现炫酷的界面,你可以考虑以下几点:1. 使用不同的布局管理器:Swing提供了多种布局管理器,如BorderLay...
    99+
    2023-08-26
    JAVA swing
  • 使用Qt怎么实现进度条
    本篇文章为大家展示了使用Qt怎么实现进度条,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、前言  有时我们需要在表格(QTableWidget)、树状栏(QTreeWidget)中直观显示任务进度...
    99+
    2023-06-15
  • 使用PYQT5怎么实现一个界面嵌套功能
    这篇文章给大家介绍使用PYQT5怎么实现一个界面嵌套功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。简单演示下:首先主界面界面:在Form处设置下水平布局,就如下图:左右两侧分别是一个frame控件,左侧frame里...
    99+
    2023-06-08
  • 怎么使用jQuery,Angular实现登录界面验证码
    小编给大家分享一下怎么使用jQuery,Angular实现登录界面验证码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最终实现的...
    99+
    2022-10-19
  • php怎么用cookie来实现登陆界面
    本文操作环境:Windows7系统、PHP7.1版、Dell G3电脑。php怎么用cookie来实现登陆界面?PHP 登录界面利用 cookie 记住账号密码界面效果:cookie 原理:cookie 在服务器端进行创建,并返回给客户端浏...
    99+
    2019-03-28
    PHP cookie
  • Python不用Gui怎么实现图形界面
    这篇文章主要介绍了Python不用Gui怎么实现图形界面的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python不用Gui怎么实现图形界面文章都会有所收获,下面我们一起来看看吧。神器出场Web 程序是用 Fl...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作