Выключение WA_TranslucentBackground останавливает перерисовку - PullRequest
3 голосов
/ 11 января 2012

У меня есть окно PyQt4.9, где я хотел бы включить или выключить полупрозрачность.Причина в том, что он иногда показывает полноразмерное управление фононным видео, которое не работает, когда установлен атрибут WA_TranslucentBackground.(Из-за ошибки Qt https://bugreports.qt.io/browse/QTBUG-8119)

Проблема, с которой я столкнулся, заключается в том, что после того, как я вернул атрибут WA_TranslucentBackground обратно в false, после того, как он был равен true, окно больше не будет перерисовываться, поэтому оно остается застрявшим, показывая то жес этого момента. Интересно, что события щелчка по-прежнему реагируют.

Ниже приведен пример кода. Нажмите кнопку увеличения, чтобы обновить текст кнопки. Нажмите кнопку переключения, а затем снова нажмите кнопку увеличения иобновления больше не отображаются. Нажатие на кнопку выхода закрывает окно, показывая, что события по-прежнему реагируют.

Если у кого-либо есть какие-либо решения, обходные пути или исправления, я буду признателен им. Спасибо.

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 Ответ

2 голосов
/ 11 января 2012

Попробуйте заменить 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)

...