专栏首页跟Qt君学编程Qt透明无边框窗口

Qt透明无边框窗口

文章介绍如何设置窗口透明,无边框和拖动。

0x00 如何透明窗口?

  第一步:开启窗口的透明层。

setWindowFlag(Qt::FramelessWindowHint); /* 注意:如果单纯开启窗口透明层效果,在Windows系统中必须设置, 其他系统可忽略。*/
setAttribute(Qt::WA_TranslucentBackground);

  第二步: 重写paintEvent事件并使用QPainter画透明层。

void paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    /* 0x20为透明层颜色,可自定义设置为0x0到0xff */
    painter.fillRect(this->rect(), QColor(0, 0, 0, 0x20)); 
}

0x01 如何无边框窗口?

  设置setWindowFlag(Qt::FramelessWindowHint)即可无边框窗口,但无法移动和改变大小。

0x02 如何拖拽窗口?

由于系统窗口被设置为Qt::FramelessWindowHint会导致窗口不能被拖动。通过捕获鼠标移动事件从而实现窗口移动。

void mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
    	/* 捕获按下时坐标 */
        m_startPoint = frameGeometry().topLeft() - event->globalPos();
    }
}

void mouseMoveEvent(QMouseEvent *event)
{
    /* 移动窗口 */
    this->move(event->globalPos() + m_startPoint);
}

0x03 完整代码

#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QPainter>
#include <QMouseEvent>

class TransparentWidget : public QWidget
{
    Q_OBJECT
public:
    TransparentWidget(QWidget *parent = 0)
        : QWidget(parent)
    {
        setWindowTitle(QString::fromLocal8Bit("透明无边框窗口"));
        setFixedSize(480, 320);
        setWindowFlag(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);

        QPushButton *button = new QPushButton("Hello world!", this);
        button->setGeometry(5, 5, 80, 40);
    }

    void paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
        painter.fillRect(this->rect(), QColor(0, 0, 0, 0x20)); /* 设置透明颜色 */
    }

    void mousePressEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton) {
            m_startPoint = frameGeometry().topLeft() - event->globalPos();
        }
    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        this->move(event->globalPos() + m_startPoint);
    }

private:
    QPoint m_startPoint;
};

0x04 源码地址

https://github.com/aeagean/QtCustomWidget.git

本文分享自微信公众号 - Qt君(qtjuna)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 根据窗口句柄置顶窗口

    SetWindowPos函数改变一个「子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序」。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口...

    Qt君
  • 设置程序运行时的字符编码

      关于可设置的编码可参考(windows平台): https://docs.microsoft.com/zh-cn/windows/win32/Intl/co...

    Qt君
  • 收集Qt支持的emoji表情-第四弹

    Qt君
  • 一起来学matlab-matlab学习笔记8 基本绘图命令_1 图形窗口简介

    本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一...

    DrawSky
  • 概率论从入门到放弃?布朗学霸火到宕机的毕业作品,让统计“看得见”

    黄白球在箱子里拿来拿去怎么也拿不到自己想要的,硬币抛来抛去也没有看到另一面,生日算来算去还是跟喜欢的人不一样。

    大数据文摘
  • 概率论从入门到放弃?布朗学霸火到宕机的毕业作品,让统计“看得见”

    黄白球在箱子里拿来拿去怎么也拿不到自己想要的,硬币抛来抛去也没有看到另一面,生日算来算去还是跟喜欢的人不一样。

    zenRRan
  • Linux常用工作命令

    心跳包
  • JavaScript 朗读文本,播放声音

    由于网页设计大赛的事,想要搞点高级货,但是这周五就要交稿了,所以折腾一点没那么难的却很酷炫的功能。

    iVampireSP.com
  • swoole深入学习 2. tcp Server和tcp Client

    这节来学习Swoole最基础的Server和Client。会通过创建一个tcp Server来讲解。

    sunsky
  • 为什么国内程序员更喜欢用国外技术网站?

    目前国内程序员的数量已经几百万之众,中国的软件经过最近几十年的发展已经取得了绝大的进步,亚诞生了像bat这样在全球都很有名的互联网公司,但你会发现很多程序员还是...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券