前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt透明无边框窗口

Qt透明无边框窗口

作者头像
Qt君
发布2019-11-29 11:35:05
2.5K0
发布2019-11-29 11:35:05
举报
文章被收录于专栏:跟Qt君学编程

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

0x00 如何透明窗口?

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

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

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

代码语言:javascript
复制
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会导致窗口不能被拖动。通过捕获鼠标移动事件从而实现窗口移动。

代码语言:javascript
复制
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 完整代码

代码语言:javascript
复制
#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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 如何透明窗口?
  • 0x01 如何无边框窗口?
  • 0x02 如何拖拽窗口?
  • 0x03 完整代码
  • 0x04 源码地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档