用Qt显示半透明/不规则形状的窗户

时间:2009-08-26 10:01:14

标签: windows user-interface qt cross-platform transparency

是否可以用Qt显示半透明和/或不规则形状的窗户?

(我假设它最终取决于底层GUI系统的功能,但至少假设Windows XP / Mac OS X)

如果是这样,一个人如何做到这一点?

2 个答案:

答案 0 :(得分:11)

是的,有可能。关键是Qt::WA_TranslucentBackground

QWidget属性

这是一个简单的类,它绘制一个圆形的半透明窗口,背景为红色50%alpha。

TranslucentRoundWindow.h:

#include <QWidget>

class TranslucentRoundWindow : public QWidget
{
    public:
        TranslucentRoundWindow(QWidget *parent = 0);
        virtual QSize sizeHint() const;

    protected:
        virtual void paintEvent(QPaintEvent *paintEvent);
};

TranslucentRoundWindow.cpp:

#include <QtGui>

#include "TranslucentRoundWindow.h"

TranslucentRoundWindow::TranslucentRoundWindow(QWidget *parent) : QWidget(parent, Qt::FramelessWindowHint)
{
    setAttribute(Qt::WA_TranslucentBackground);
}

QSize TranslucentRoundWindow::sizeHint() const
{
    return QSize(300, 300);
}

void TranslucentRoundWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(255, 0, 0, 127));

    painter.drawEllipse(0, 0, width(), height());
}

如果您希望能够使用鼠标移动此窗口,则必须覆盖mousePressEventmouseMoveEventmouseReleaseEvent

答案 1 :(得分:3)

当然有可能。 Qt随附“形状时钟”演示。其文档为here

它创建一个奇怪形状的顶级窗口。应该是你所需要的一切。