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
метод enableBlurBehindWindow() имеет еще две перегрузки, вы можете посмотреть их в этой документации
Для дочерних виджетов вы можете использовать
setStyleSheet("background:transparent");