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 бит.

P.S. — Он не должен вести себя как полупрозрачное окно, то есть, когда фон можно нажимать через прозрачные части виджета WA_TranslucentBackground, Здесь, пока он прозрачен, все будет хорошо, его не нужно нажимать «до конца».

3

Решение

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

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

1

Другие решения

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

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

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

0

По вопросам рекламы [email protected]