python-qt5
python-qt5 copied to clipboard
Can not create window win transparent background
I can not create a window with transparent background with PyQt.
On my other other computer which runs Manjaro it works well, but not on my current, which runs Kubuntu 20.04. I tried both with PyQt 5.15 and 5.12 (the version used by KDE).
Here is a minimal example that displays a circle:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QBrush
from PyQt5.QtWidgets import QDialog, QApplication
WIDTH=400
HEIGHT=400
class MyWindow(QDialog):
def __init__(self):
super().__init__()
self.setModal(True)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.setWindowFlags(Qt.Window | Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
# self.setWindowOpacity(0.5)
# self.setStyleSheet('background: transparent; background-color: none; opacity: 0.5;')
# self.setAttribute(Qt.WA_NoSystemBackground, True)
# self.setAttribute(Qt.WA_OpaquePaintEvent, False)
# self.setAttribute(Qt.WA_PaintOnScreen)
self.setMinimumWidth(WIDTH)
self.setMinimumHeight(HEIGHT)
self.setMaximumWidth(WIDTH)
self.setMaximumHeight(HEIGHT)
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setBrush(QBrush(Qt.gray, Qt.SolidPattern))
painter.drawEllipse(0, 0, WIDTH, HEIGHT)
def main():
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
All the commented lines are different solutions I have tested without success.
And here is the c++ equivalent, that works well:
#include <stdlib.h>
#include <QApplication>
#include <QDialog>
#include <QDialog>
#include <Qt>
#include <QPainter>
#define WIDTH 400
#define HEIGHT 400
class Dialog: public QDialog {
public:
Dialog() {
this->setModal(true);
this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground, 1);
this->setMinimumWidth(WIDTH);
this->setMinimumHeight(HEIGHT);
this->setMaximumWidth(WIDTH);
this->setMaximumHeight(HEIGHT);
}
void paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(QBrush(Qt::gray, Qt::SolidPattern));
painter.drawEllipse(0, 0, WIDTH, HEIGHT);
}
void show() {
QDialog::show();
}
};
int main( int argc, char **argv ) {
QApplication app( argc, argv );
Dialog* dialog = new Dialog();
dialog->show();
return app.exec();
}