当前位置:   article > 正文

Qt透明无边框窗口_透明qt::framelesswindowhint

透明qt::framelesswindowhint

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

demo

0x00 如何透明窗口?

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

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

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

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

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

0x04 源码地址

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/95186
推荐阅读
相关标签
  

闽ICP备14008679号