Мне нужно нарисовать прозрачное окно (либо 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
, Здесь, пока он прозрачен, все будет хорошо, его не нужно нажимать «до конца».
К сожалению, это невозможно в 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», чтобы затемнить фон экрана.