Qt - Рисовать полностью прозрачное окно в Windows без использования WA_TranslucentBackground

Мне нужно нарисовать прозрачное окно (либо QLabel или же QFrame или же QWidget), но без использования WA_TranslucentBackground, Причина этого заключается в том, что окна будут содержать другие дочерние виджеты, отображаемые через OpenGL, и использование этого свойства делает эти окна невидимыми в Windows, как описано здесь. Это прекрасно работает в Mac, хотя мне нужно другое решение только для Windows, так как оно там не работает. Я пробовал это: установка пустого pixmap, Но он все еще отображается на сером фоне:

#include <QApplication>
#include <QLabel>
#include <QBitmap>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel l;
    l.setWindowFlags(Qt::FramelessWindowHint);
    QPixmap p("");
    l.setPixmap(p);
    l.setScaledContents(true);
    l.resize(300, 500); //just to test my idea
    l.setMask(p.scaled(l.width(),l.height(),Qt::IgnoreAspectRatio,
    Qt::SmoothTransformation).mask());
    l.show();
    return a.exec();
}

Кто-нибудь может предложить какие-либо другие способы достижения этого в Windows, то есть полностью прозрачное окно? Платформа - Qt 5.3.1, 32 бит.

PS - Это не должно вести себя как полупрозрачное окно, то есть, где фон можно щелкнуть через прозрачные части виджета, отображаемого, хотя WA_TranslucentBackground, Здесь, пока он прозрачен, все будет хорошо, его не нужно нажимать "до конца".

2 ответа

Решение

К сожалению, это невозможно в Windows. Вы можете установить прозрачность для виджета с цветом с помощью альфа-канала следующим образом: setStyleSheet("background-color: rgba(255,0,0,50%);");, Но это не работает для виджета верхнего уровня, пока вы не установите WA_TranslucentBackground, Без этого флага альфа-канал не работает, и вы получаете черное окно. Таким образом, единственным решением является использование WA_TranslucentBackground, А затем выполните рисование OpenGL, как в документации Qt:

Чтобы обойти эту проблему, вы можете либо просто использовать Qt для рендеринга всего, а не OpenGL, либо вы можете визуализировать OpenGL в растровое изображение и вместо этого нарисовать его на своем виджете.

Я нахожусь в Windows (Qt 5) и использую следующее для создания полупрозрачного виджета:

setWindowOpacity(0.6);
setStyleSheet("QWidget{background: #000000}")

Это должно работать, если вы установите прозрачность на ноль. Я использую это вместе с флагами Windows "framelessWindow" и "Tool", чтобы затемнить фон экрана.

Прозрачности можно добиться, включив размытие за окном и установив для атрибута windows значение WA_TranslucentBackground

  setAttribute(Qt::WA_TranslucentBackground);
    QtWin::enableBlurBehindWindow(this); 

требуется, cpp include: include , файл проекта включает: QT += winextras

метод enableBlurBehindWindow() имеет еще две перегрузки, вы можете посмотреть их в этой документации

Для дочерних виджетов вы можете использовать

setStyleSheet("background:transparent");
Другие вопросы по тегам