如何制作透明的QT Dock小部件

3
在Windows上,我正在尝试创建具有透明的 DOCKWIDGETS 的Qt应用程序,其中 dockwidget 在漂浮时背景是透明的。所以我们可以透过 dockwidget 看到其下方。 目前它的外观如下所示为黑色。

输入图片描述 以下是代码:

    QDockWidget * dock3 = new QDockWidget(tr("DOCK3 TranslucentBackground"), 
    textEdit,Qt::FramelessWindowHint);
    dock3->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    //dock3->setWindowFlags(dock2->windowFlags()|Qt::FramelessWindowHint);
    dock3->setAttribute(Qt::WA_TranslucentBackground);
    //dock3->setAttribute(Qt::WA_NoSystemBackground);
   {
        QWidget* WindowRect = new QWidget(dock3);
        QWidget* titleRect = new QLabel ("Title",WindowRect);
        titleRect->setFixedSize(QSize(30,60));
        titleRect->setStyleSheet("background:rgb(0,0,255);");
        QWidget* ContentRect = new QLabel("Content",WindowRect);
        ContentRect->setFixedSize(QSize(60,30));
        ContentRect->setStyleSheet("background:rgb(0,255,0);");
        QVBoxLayout* layout = new QVBoxLayout(WindowRect);
        layout->addWidget(titleRect);
        layout->addWidget(ContentRect);
        dock3->setWidget(WindowRect);
    }

你应该发布你的代码(作为MCVE),这样我们才能理解为什么它看起来是黑色的... - jpo38
3个回答

0

一种方法是使用QDockWidgetsetWindowOpacity(qreal)函数。
但请记住,这将应用于QDockWidget的所有子元素。

参考链接:https://doc.qt.io/qt-5/qwidget.html#windowOpacity-prop

另一种方法是使用样式表:setStyleSheet("background-color: transparent;");。不幸的是,这对顶层窗口小部件无效,除非您设置基本窗口小部件的WA_TranslucentBackground属性。

参考链接:
https://doc.qt.io/qt-5/stylesheet.html
https://doc.qt.io/qt-5/qwidget.html#styleSheet-prop


"setWindowOpacity" 函数会使所有子部件透明。我希望子部件不透明。 - living on edge
对于第二种解决方案,它在浮动时显示为黑色背景。 - living on edge

0

请参考以下文章: Qt 技巧:小部件蒙版

你可以使用以下方法:

setStyleSheet("background-color: rgba(0,0,0,0)");

您可以通过更改您的小部件样式来在绘图自定义中尝试:

MyCustomWidget {background-color: none;}

应该可以运行。


0

我明白您想要在浮动时仅查看停靠栏。当它不浮动时,因为没有东西可以被显示,所以这是没有意义的。

使用setAttribute(Qt::WA_TranslucentBackground) 就可以解决问题了。我使用的是Linux,希望它也适用于Windows(我发现一些帖子中人们还额外设置了setAttribute(Qt::WA_NoSystemBackground) ,但在Linux下对我来说没有任何区别,如果Qt::WA_TranslucentBackground 对您不够,请尝试两者都使用)。

#include <QMainWindow>
#include <QApplication>
#include <QDockWidget>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;

    w.setCentralWidget( new QWidget() );
    w.centralWidget()->setStyleSheet("background-color: green");

    QDockWidget* dock = new QDockWidget();
    dock->setWidget( new QLabel("Hello World",dock) );

    // make docking bar transparent!
    dock->setAttribute(Qt::WA_TranslucentBackground);

    w.addDockWidget(Qt::BottomDockWidgetArea,dock, Qt::Horizontal);

    w.show();

    return a.exec();
}

当连接时,它看起来像这样:

enter image description here

当浮动时,它看起来像这样:

enter image description here

您可以看到中央小部件(绿色),可以通过停靠栏可见。

参考:使QWidget透明


这正是我想要的,但我已经尝试过了,我已经按照上面的代码添加了。正如你所说,在Linux上似乎可以工作,但在Windows上不行。它显示为黑色背景。 - living on edge
你应该报告一个Qt的bug:https://bugreports.qt.io/ - jpo38

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