Отключение WA_TranslucentBackground останавливает перерисовку окна
У меня есть окно PyQt4.9, где я хотел бы включить или выключить полупрозрачность. Причина в том, что он иногда показывает полноразмерное управление фононным видео, которое не работает, когда установлен атрибут WA_TranslucentBackground. (Из-за ошибки Qt https://bugreports.qt.io/browse/QTBUG-8119)
У меня проблема в том, что после того, как я вернул атрибут WA_TranslucentBackground обратно в false, после того, как он стал истинным, окно больше не будет перерисовываться, поэтому оно остается застрявшим, показывая то же самое с этого момента. Интересно, что события клика по-прежнему отвечают.
Ниже приведен пример кода. Нажмите кнопку увеличения, и она обновит текст кнопки. Нажмите кнопку переключения, а затем снова нажмите кнопку увеличения, и обновления больше не отображаются. Нажатие на кнопку выхода закрывает окно, показывая, что события все еще отвечают.
Если у кого-то есть какие-либо решения, обходные пути или исправления, я буду признателен им. Благодарю.
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Settings(QWidget):
def __init__(self, desktop):
QWidget.__init__(self)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.setWindowFlags(Qt.FramelessWindowHint)
self.istransparent = True
self.count = 0
self.setWindowTitle("Transparent")
self.resize(300, 150)
self.incr_button = QPushButton("Increment")
toggle_button = QPushButton("Toggle Transparency")
exit_button = QPushButton("Exit")
grid = QGridLayout()
grid.addWidget(self.incr_button, 0, 0)
grid.addWidget(toggle_button, 1, 0)
grid.addWidget(exit_button, 2, 0)
self.setLayout(grid)
self.connect(toggle_button, SIGNAL("clicked()"), self.toggle)
self.connect(self.incr_button, SIGNAL("clicked()"), self.increment)
self.connect(exit_button, SIGNAL("clicked()"), self.close)
def increment(self):
self.count = self.count + 1
self.incr_button.setText("Increment (%i)" % self.count)
def toggle(self):
self.istransparent = not self.istransparent
self.setAttribute(Qt.WA_TranslucentBackground, self.istransparent)
if __name__ == "__main__":
app = QApplication(sys.argv)
s = Settings(app.desktop())
s.show()
sys.exit(app.exec_())
1 ответ
Попробуй заменить self.setAttribute(Qt.WA_TranslucentBackground, ...)
звонит в __init__
а также toggle
с помощью следующего метода.
def set_transparency(self, enabled):
if enabled:
self.setAutoFillBackground(False)
else:
self.setAttribute(Qt.WA_NoSystemBackground, False)
self.setAttribute(Qt.WA_TranslucentBackground, enabled)
self.repaint()
Протестировано на PyQt-Py2.7-x86-gpl-4.9-1 (Windows 7)