Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用Qt显示半透明/不规则形状的窗口_Windows_User Interface_Qt_Cross Platform_Transparency - Fatal编程技术网

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

Windows 使用Qt显示半透明/不规则形状的窗口,windows,user-interface,qt,cross-platform,transparency,Windows,User Interface,Qt,Cross Platform,Transparency,是否可以使用Qt显示半透明和/或不规则形状的窗口 (我假设这最终取决于底层GUI系统的功能,但让我们假设至少是Windows XP/Mac OS X) 如果是这样的话,我们如何做到这一点呢?这当然是可能的。Qt附带“成型时钟”演示。其文档是 它创建了一个具有奇数形状的顶级窗口。应该就是你所需要的了。是的,这是可能的。关键是QWidget 下面是一个简单的类,它绘制了一个带有50%alpha红色背景的圆形半透明窗口 TranslatorCentroundWindow.h: #包括 类:公共QWid

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

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


如果是这样的话,我们如何做到这一点呢?

这当然是可能的。Qt附带“成型时钟”演示。其文档是


它创建了一个具有奇数形状的顶级窗口。应该就是你所需要的了。

是的,这是可能的。关键是
QWidget

下面是一个简单的类,它绘制了一个带有50%alpha红色背景的圆形半透明窗口

TranslatorCentroundWindow.h:
#包括
类:公共QWidget
{
公众:
半透明中心窗口(QWidget*parent=0);
虚拟QSize sizeHint()常量;
受保护的:
虚拟void paintEvent(QPaintEvent*paintEvent);
};
TranslatorCentroundWindow.cpp:
#包括
#包括“TransparentRoundWindow.h”
半透明中心窗口::半透明中心窗口(QWidget*parent):QWidget(parent,Qt::FramelessWindowHint)
{
setAttribute(Qt::WA_半透明背景);
}
QSize TransparentRoundWindow::sizeHint()常量
{
返回QSize(300300);
}
void TranslatorCentroundWindow::paintEvent(QPaintEvent*)
{
油漆工(本);
painter.setRenderInt(QPainter::抗锯齿);
painter.setPen(Qt::NoPen);
画家:挫折(QColor(255,0,0,127));
painter.drawerlipse(0,0,width(),height());
}

如果你想用鼠标移动这个窗口,你必须覆盖
mousePressEvent
mouseMoveEvent
mousereleasevent
,这并不能解决问题的半透明部分。复制并粘贴在上面,我得到的只是一个黑色正方形,里面有一个红色圆圈。我错过了什么?你尝试过什么操作系统?这在Windows和OS X上运行良好。另外,您使用的是什么Qt版本?如果我没记错的话,这个答案是用Qt4.4或4.5写的。QT附带的示例都可以正常工作。在Windows上,您必须具有
setWindowFlags(QT::FramelessWindowHint)
#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());
}