查看完整版本: [-- Qt编写的遮罩层窗体+全局截图 --]

QTCN开发网 -> Qt 作品展 -> Qt编写的遮罩层窗体+全局截图 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

liudianwu 2016-12-29 09:09

Qt编写的遮罩层窗体+全局截图

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

源码下载:[attachment=16286]
PS:支持从Qt4.6到Qt5.8任意版本+任意编译器。
近期颈椎疼,可能本站活跃度会大大降低一段时间,修养修养!

pangwei 2016-12-29 10:00
验证可用,刘大师出品,必是精品

listen342325 2016-12-29 10:03
同样脊椎疼,低头代码多了。

weinkym 2016-12-29 10:15
弄个高显示器

songhuirong1 2016-12-29 12:26
我想知道的是你的私活是哪里接到的?求楼主分享。谢谢。

圣域天子 2016-12-29 13:04
截图工具有点不足:
1. 不能在拉好范围后缩放大小
2. 不能在上面画框画圆等
背景黑幕如果能快速渐变就更好了

919974096 2016-12-29 14:07
有一个问题,在弹出弹窗一出现遮罩后,然后点击任务栏图标隐藏出现,就没有遮罩了。。

liudianwu 2016-12-29 15:09
圣域天子:截图工具有点不足:
1. 不能在拉好范围后缩放大小
2. 不能在上面画框画圆等
背景黑幕如果能快速渐变就更好了
[表情]  (2016-12-29 13:04) 

嗯,能够得到版主中肯的建议,非常荣幸。目前暂时没有时间更正完善,自己暂时够用。呵呵!以后完善了再发布上来!

liudianwu 2016-12-29 15:18
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);
}

samhuilong 2017-01-03 09:41
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 2017-01-03 15:34
看过大师写的自定义控件大全,不知道你建立的QFramework是直接定义成一个类来进行调用,还是按照项目分,有用到再copy代码啊?
控件那些都是绘制的吗?如果生成了dll来进行调用,那么图片资源怎么调用?

weinkym 2017-01-04 17:44
可以通过paintevent 实现遮罩

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

按照项目分,用到就include pri的形式。控件全部做成了插件形式,和QWT一样。

gfanny 2017-01-12 12:48
受益非浅,谢谢分享

loveabcc 2017-01-12 15:12
mark

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

chenyan 2017-12-26 14:23
    

youthdou 2018-03-27 20:44

jgcddd 2018-03-31 15:22
这个遮罩效果在android系统下是不行。

jgcddd 2018-03-31 15:24
weinkym:可以通过paintevent 实现遮罩 (2017-01-04 17:44) 

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

cleehom 2019-03-19 17:14
有多级弹窗就不起作用了

keleshome 2020-07-31 17:43
大佬就是不一样,代码超赞!

dup000 2022-06-30 13:59
下载下来才5K不到,解压不出来。为什么啊

liudianwu 2022-06-30 19:58
dup000:下载下来才5K不到,解压不出来。为什么啊 (2022-06-30 13:59) 

你确定?


查看完整版本: [-- Qt编写的遮罩层窗体+全局截图 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled