• 20655阅读
  • 23回复

Qt编写的遮罩层窗体+全局截图 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2016-12-29
最近接了个私活,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改。
优点:只需要引入一个头文件和实现文件即可,在主窗体中设置下需要遮罩的主窗体和可能弹窗窗体的类名即可。就是如此简单。
  1. //第一步,设置需要遮罩的父窗体
  2.     MaskWidget::Instance()->setMainWidget(this);
  3.     //第二步,设置哪些弹窗窗体需要被遮罩
  4.     QStringList dialogNames;
  5.     dialogNames << "frm1" << "frm2";
  6.     MaskWidget::Instance()->setDialogNames(dialogNames);
附带的全局截屏类,也是只要一行代码即可在项目任何地方使用全局截屏。
  1. ScreenWidget::Instance()->showFullScreen();
是不是接口极为简单方便呢。
效果图:

项目案例图:


源码下载 maskdemo.zip (158 K) 下载次数:1538
PS:支持从Qt4.6到Qt5.8任意版本+任意编译器。
近期颈椎疼,可能本站活跃度会大大降低一段时间,修养修养!
21条评分好评度+3贡献值+3金钱+20威望+5
dup000 威望 +1 - 2022-06-30
czzcreator 金钱 +1 真棒 2020-07-30
mengkun 金钱 +1 谢谢! 2019-03-07
liruigood 金钱 +1 - 2018-03-28
yzq189424658 好评度 +1 非常感谢 2018-03-28
yzq189424658 贡献值 +1 非常感谢 2018-03-28
yzq189424658 威望 +1 非常感谢 2018-03-28
yzq189424658 金钱 +3 非常感谢 2018-03-28
laixiaoqi 金钱 +1 - 2018-03-24
q小玩家 金钱 +3 谢谢!帮助老大了! 2018-03-15
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线pangwei

只看该作者 1楼 发表于: 2016-12-29
验证可用,刘大师出品,必是精品
离线listen342325

只看该作者 2楼 发表于: 2016-12-29
同样脊椎疼,低头代码多了。
Qt 不错的选择
离线weinkym

只看该作者 3楼 发表于: 2016-12-29
弄个高显示器
离线songhuirong1

只看该作者 4楼 发表于: 2016-12-29
我想知道的是你的私活是哪里接到的?求楼主分享。谢谢。
离线圣域天子

只看该作者 5楼 发表于: 2016-12-29
截图工具有点不足:
1. 不能在拉好范围后缩放大小
2. 不能在上面画框画圆等
背景黑幕如果能快速渐变就更好了
离线919974096

只看该作者 6楼 发表于: 2016-12-29
有一个问题,在弹出弹窗一出现遮罩后,然后点击任务栏图标隐藏出现,就没有遮罩了。。
离线liudianwu

只看该作者 7楼 发表于: 2016-12-29
回 圣域天子 的帖子
圣域天子:截图工具有点不足:
1. 不能在拉好范围后缩放大小
2. 不能在上面画框画圆等
背景黑幕如果能快速渐变就更好了
[表情]  (2016-12-29 13:04) 

嗯,能够得到版主中肯的建议,非常荣幸。目前暂时没有时间更正完善,自己暂时够用。呵呵!以后完善了再发布上来!
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线liudianwu

只看该作者 8楼 发表于: 2016-12-29
回 919974096 的帖子
919974096:有一个问题,在弹出弹窗一出现遮罩后,然后点击任务栏图标隐藏出现,就没有遮罩了。。
 (2016-12-29 14:07) 

需要在maskwidget构造函数中加一句,设置个置顶显示。
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
然后在事件过滤器中将弹窗窗体激活。
bool MaskWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::Show) {
        if (dialogNames.contains(obj->objectName())) {
            this->show();
            QWidget *w = (QWidget *)obj;
            w->activateWindow();
        }
    } else if (event->type() == QEvent::Hide) {
        if (dialogNames.contains(obj->objectName())) {
            this->hide();
        }
    }

    return QObject::eventFilter(obj, event);
}
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线samhuilong

只看该作者 9楼 发表于: 2017-01-03
回 liudianwu 的帖子
liudianwu:需要在maskwidget构造函数中加一句,设置个置顶显示。
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
然后在事件过滤器中将弹窗窗体激活。
bool MaskWidget::eventFilter(QObject *obj, QEvent *event)
....... (2016-12-29 15:18) 

刘大师,加上Qt::WindowStaysOnTopHint,切换到其他的应用程序的时候,也会显示这个最顶层的窗口,如果去掉这个属性,有什么办法可以控制绘制的遮照和弹出窗口的顺序(去掉这个属性,遮照绘制在弹出窗口的前面)
离线25133777

只看该作者 10楼 发表于: 2017-01-03
看过大师写的自定义控件大全,不知道你建立的QFramework是直接定义成一个类来进行调用,还是按照项目分,有用到再copy代码啊?
控件那些都是绘制的吗?如果生成了dll来进行调用,那么图片资源怎么调用?
离线weinkym

只看该作者 11楼 发表于: 2017-01-04
可以通过paintevent 实现遮罩
离线liudianwu

只看该作者 12楼 发表于: 2017-01-04
回 25133777 的帖子
25133777:看过大师写的自定义控件大全,不知道你建立的QFramework是直接定义成一个类来进行调用,还是按照项目分,有用到再copy代码啊?
控件那些都是绘制的吗?如果生成了dll来进行调用,那么图片资源怎么调用? (2017-01-03 15:34) 

按照项目分,用到就include pri的形式。控件全部做成了插件形式,和QWT一样。
1条评分金钱+1
bs1003506507 金钱 +1 - 2017-01-12
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线gfanny

只看该作者 13楼 发表于: 2017-01-12
受益非浅,谢谢分享
离线loveabcc

只看该作者 14楼 发表于: 2017-01-12
mark
离线yangliu8623

只看该作者 15楼 发表于: 2017-08-07
这个还是不如写一个widget,paint事件里面绘的时候给一个透明度,MaskWidget这个类,虽然方便,但是这个类,没有父窗口,鼠标移动到任务栏时会显示两个窗口,另外qt的Qt::WindowFlags窗口标志用起来各种问题
离线chenyan

只看该作者 16楼 发表于: 2017-12-26
    
离线youthdou

只看该作者 17楼 发表于: 2018-03-27
离线jgcddd

只看该作者 18楼 发表于: 2018-03-31
这个遮罩效果在android系统下是不行。
离线jgcddd

只看该作者 19楼 发表于: 2018-03-31
回 weinkym 的帖子
weinkym:可以通过paintevent 实现遮罩 (2017-01-04 17:44) 

paintevent在其它系统是可以实现的,不过android系统下效果不好,这个会是会原因呢?
离线cleehom

只看该作者 20楼 发表于: 2019-03-19
有多级弹窗就不起作用了
离线keleshome

只看该作者 21楼 发表于: 2020-07-31
大佬就是不一样,代码超赞!
离线dup000

只看该作者 22楼 发表于: 2022-06-30
下载下来才5K不到,解压不出来。为什么啊
离线liudianwu

只看该作者 23楼 发表于: 2022-06-30
回 dup000 的帖子
dup000:下载下来才5K不到,解压不出来。为什么啊 (2022-06-30 13:59) 

你确定?
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个