专栏首页Qt项目实战Qt开源作品18-无边框背景透明窗体
原创

Qt开源作品18-无边框背景透明窗体

一、前言

用Qt来做无边框北京透明窗体非常简单,根本不需要用什么系统层的API来实现透明什么的,Qt本身提供了很多种设置窗体透明的方法,除了可以设置窗体的属性为透明以外,还可以设置透明度函数,以及qss来设置透明度颜色等,方法很多,按照需要可以选用自己最合适的办法,如果想要整个窗体的背景图类似于无边框的异行,你只需要准备一张美工做好的png带透明的背景图即可,直接用qss的形式设置为窗体的背景图,你也可以用painter绘制上去,这样就可以产生各种奇形怪状的异行窗体,比如中间挖个洞的背景图,可以直接穿透桌面。

二、代码思路

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setAttribute(Qt::WA_TranslucentBackground);
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint);
    ui->widget->installEventFilter(this);
    ui->widget->setStyleSheet(QString("background-image:url(:/image/%1.png);").arg(1));
}

Widget::~Widget()
{
    delete ui;
}

bool Widget::eventFilter(QObject *watched, QEvent *evt)
{
    static int index = 1;
    static QPoint mousePoint;
    static bool mousePressed = false;

    QMouseEvent *event = static_cast<QMouseEvent *>(evt);
    if (event->type() == QEvent::MouseButtonPress) {
        if (event->button() == Qt::LeftButton) {
            mousePressed = true;
            mousePoint = event->globalPos() - this->pos();

            if (index == 5) {
                index = 1;
            } else {
                index++;
            }

            ui->widget->setStyleSheet(QString("background-image:url(:/image/%1.png);").arg(index));

            return true;
        } else {
            exit(0);
        }
    } else if (event->type() == QEvent::MouseButtonRelease) {
        mousePressed = false;
        return true;
    } else if (event->type() == QEvent::MouseMove) {
        if (mousePressed && (event->buttons() && Qt::LeftButton)) {
            this->move(event->globalPos() - mousePoint);
            return true;
        }
    }

    return QWidget::eventFilter(watched, event);
}

三、效果图

bgdemo.gif

四、开源主页

以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Qt开源作品24-遮罩层窗体

    在有些项目中,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改。只需要引入一个头文件和实现文件,...

    feiyangqingyun
  • Qt开源作品6-通用视频控件

    在之前做的视频监控系统中,根据不同的用户需要,做了好多种视频监控内核,有ffmpeg内核的,有vlc内核的,有mpv内核的,还有海康sdk内核的,为了做成通用的...

    feiyangqingyun
  • Qt编写地图综合应用16-省市轮廓图下载

    之前做获取边界点的时候,主要采用的是在线地图的方式,因为在线地图中直接内置了函数可以根据行政区域的名称来自动获取边界,其实这些边界就是一些点坐标集合连接起来的平...

    feiyangqingyun
  • Qt屏蔽窗口关闭按钮

    Qt君
  • DevOps之工程师文化

    Devops注重协同文化,开发、QA和运维人员必须进行密切的合作。开发应该把QA和运维角色理解成软件的另一个用户群体。协作有几个的建议:1.自动化,减少不必要的...

    用户7533190
  • 用 LDA 和 LSA 两种方法来降维和做 Topic 建模

    图片链接: https://pixabay.com/en/golden-gate-bridge-women-back-1030999/

    AI研习社
  • 第十四节:窗体实验

    定义类继承JFrame 调用JFrame中的相关方法显示窗体 根据窗体中的组件为窗口添加成员变量并实例化每个组件。

    达达前端
  • Qt Quick实践系列-一门新技术

      Qt Quick提供了一种称为QML的声明式语言,但我们大多数将Qt Quick称为QML(Qt Meta-Object Language: Qt元对象语言...

    Qt君
  • FFmpeg开发环境构建

    本文主要讲述linux平台x86(及x86-64)架构下的ffmpeg编译安装过程。 其他嵌入式平台需要交叉编译,过程类似,不详述。 本实验在opensus...

    用户4940323
  • Oracle在12.1.0.2开始改变了补丁策略

    ORACLE数据库提供两种方式的补丁,一种是主动的Proactive Patches,另一种被动的Reactive Patches,过去的PSU,SPU/CPU...

    数据和云

扫码关注云+社区

领取腾讯云代金券