Как сделать прозрачный виджет QT Dock - PullRequest
3 голосов
/ 27 мая 2020

На Windows, я пытаюсь создать приложение Qt с прозрачным DOCKWIDGETS , где фон док-виджета прозрачен, когда он перемещается. Итак, мы можем видеть через виджет док-станции . В настоящее время он выглядит черным, как показано ниже.

enter image description here Код как ниже

    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);
    }

Ответы [ 3 ]

0 голосов
/ 07 июня 2020

Попробуйте с помощью этой статьи: Подсказка Qt и трюк: маскировка виджетов

Вы можете сделать это с помощью:

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

Вы можете попробуйте сделать это в настройке рисования, изменив стиль вашего виджета, например:

MyCustomWidget {background-color: none;}

Он должен работать

0 голосов
/ 07 июня 2020

Я так понимаю, вы хотите видеть сквозь стыковочную планку только когда она плавает. Когда он не (пристыкован), это не имеет смысла, потому что позади нет ничего, что нужно было бы показать.

Использование 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 прозрачным

0 голосов
/ 02 июня 2020

Один из способов - использовать setWindowOpacity(qreal) из QDockWidget.
Но имейте в виду, что это применит непрозрачность ко всем дочерним элементам 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 -пропуск

...