Qt透明无边框窗口

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

demo

0x00 如何透明窗口?

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

setWindowFlags(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 如何无边框窗口?

  设置setWindowFlags(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);
        setWindowFlags(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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 简述 图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部...
    YBshone阅读 5,642评论 0赞 5
  • 窗口标志示例展示了如何使用Qt中可用的窗口标志类型来指定窗口系统属性。   根据示例整理出来的各窗口标志作用一览表...
    Qt君阅读 4,561评论 0赞 0
  • 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经...
    太平小小草阅读 2,810评论 0赞 0
  • 今天是什么日子 起床:7:00 天气:阴天 心情:好 任务清单 昨日完成的任务,最重要的三件事:完成财务整理,完成...
    Rita自由之路阅读 140评论 0赞 0
  • 作为资深的文艺青年,逛博物馆是必修的功课,每过一段时间,我就会去光顾一下博物馆。 魔都大大小小的博物馆不计其数,当...
    路语旁集阅读 654评论 0赞 0

友情链接更多精彩内容