【发布时间】:2010-11-22 22:43:39
【问题描述】:
Qt 可以显示半透明和/或不规则形状的窗口吗?
(我假设它最终取决于底层 GUI 系统的功能,但我们至少假设 Windows XP / Mac OS X)
如果是这样,如何做到这一点?
【问题讨论】:
标签: windows user-interface qt cross-platform transparency
Qt 可以显示半透明和/或不规则形状的窗口吗?
(我假设它最终取决于底层 GUI 系统的功能,但我们至少假设 Windows XP / Mac OS X)
如果是这样,如何做到这一点?
【问题讨论】:
标签: windows user-interface qt cross-platform transparency
是的,这是可能的。关键是QWidget的Qt::WA_TranslucentBackground属性
这是一个简单的类,它绘制一个带有 50% alpha 的红色背景的圆形半透明窗口。
#include <QWidget>
class TranslucentRoundWindow : public QWidget
{
public:
TranslucentRoundWindow(QWidget *parent = 0);
virtual QSize sizeHint() const;
protected:
virtual void paintEvent(QPaintEvent *paintEvent);
};
#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());
}
如果您希望能够用鼠标移动此窗口,则必须覆盖 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent。
【讨论】:
setWindowFlags(Qt::FramelessWindowHint);。
这当然是可能的。 Qt 附带“Shaped Clock”演示。其中的文档是here。
它会创建一个形状奇特的顶级窗口。应该是你所需要的。
【讨论】: