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

12

在Qt中,是否可以显示半透明和/或不规则形状的窗口?

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

如果可以,如何实现这个功能?

2个回答

11

是的,这是可能的。关键在于QWidget的Qt :: WA_TranslucentBackground属性。

这是一个简单的类,它绘制了一个圆形半透明窗口,背景为红色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:

透明圆角窗口.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


复制并粘贴上述内容,我只得到一个带有红色圆圈的黑色方块。我缺少什么? - slashmais
你尝试在哪个操作系统上运行?这在Windows和OS X上都可以正常工作。另外,你使用的Qt版本是多少?如果我没记错的话,这个答案是用Qt 4.4或4.5编写的。 - 0xced
Linux 3.1.0 64位,Qt 4.6.3。QT附带的示例都可以正常工作。 - slashmais
在Windows上,您必须在窗口构造函数中添加setWindowFlags(Qt::FramelessWindowHint); - Cyril Leroux

3
当然是可以的。Qt提供了“Shaped Clock”演示程序,文档在这里。它创建了一个具有奇怪形状的顶层窗口。这应该就是你所需要的。

这并没有解决问题中关于半透明部分的问题。 - 0xced

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接