QDialog带有透明背景色

5
我想让一个的背景透明,这样我就可以透过窗口看到其他内容。我这样做是因为我想使用一个半透明的背景图像来创建“圆角窗口”的视觉效果。但是,对我来说,使用setOpacity不是一个选择,因为我希望所有小部件都保持完全不透明。
有没有一种方法可以在不使用本机操作系统API的情况下实现这一点?

可能是重复的问题:一个具有完全透明背景的Qt小部件 - BЈовић
1个回答

13

使用 QWidget::setAttribute(Qt::WA_TranslucentBackground);。请注意,这还需要设置 Qt::FramelessWindowHint

这个示例对我有效:

#include <QtGui>

class Dialog : public QDialog
{
public:
    Dialog() : QDialog(0, Qt::FramelessWindowHint) // hint is required on Windows
    {
        QPushButton *button = new QPushButton("Some Button", this);    
        setAttribute(Qt::WA_TranslucentBackground);
    }

};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog d;
    d.show();
    return a.exec();
}

关于圆角,QWidget::setMask()可以帮助你实现。

编辑:针对下面评论中的另一个问题,这里有一个使用资源文件中的图像并覆盖QWidget::paintEvent()的工作示例:

#include <QtGui>

class Dialog : public QDialog
{
public:
    Dialog() : QDialog(0, Qt::FramelessWindowHint) // hint is required on Windows
    {
        setFixedSize(500, 500); // size of the background image
        QPushButton *button = new QPushButton("Some Button", this);
        setAttribute(Qt::WA_TranslucentBackground);
    }

protected:
    void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.drawImage(QRectF(0, 0, 500, 500), QImage(":/resources/image.png"));
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog d;
    d.show();
    return a.exec();
}

我正在尝试将此与包含半透明区域的背景图像结合使用,但是我注意到当我使背景半透明时,背景图像会消失。是否有任何替代方案我应该考虑? - Pieter
1
@Pieter 我使用的是Windows 7,而我发布的代码在我的电脑上没有产生阴影效果。 - Anthony

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