python qt pyqt qmainwindow qlayout

python - (Py) Qt: El espacio en QHBoxLayout muestra el fondo del dispositivo central, no el de los padres



pyqt qmainwindow (2)

Considere el siguiente código de ejemplo:

from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QLabel, QWidget, QMainWindow, QVBoxLayout, QTextEdit) class MainWindow(QMainWindow): def __init__(self): super().__init__() cwidget = QWidget(self) cwidget.setStyleSheet("QWidget { background-color: red; }") self.setCentralWidget(cwidget) self.resize(100, 100) vbox = QVBoxLayout(cwidget) vbox.addWidget(QTextEdit(self)) vbox.addWidget(BlackBar(self)) class BlackBar(QWidget): def __init__(self, parent=None): super().__init__(parent) self.setStyleSheet("* { background-color: black; color: white; }") hbox = QHBoxLayout(self) hbox.setSpacing(5) hbox.addWidget(QLabel(text="eggs")) hbox.addWidget(QLabel(text="bacon")) if __name__ == ''__main__'': app = QApplication([]) main = MainWindow() main.show() app.exec_()

Tiene:

  • Un QMainWindow , QWidget como widget central ( rojo ), QVBoxLayout como elemento secundario del widget cental. En el interior hay:
    • Un QTextEdit (solo como un relleno)
    • Un QWidget ( negro ), que contiene un QHBoxLayout . Dentro de eso:
      • Dos QLabels

Esto se ve así:

Esperaría que los espacios entre las etiquetas sean negras, porque QHBoxLayout es hijo de BlackBar , pero parece que BlackBar es simplemente "invisible" en el medio y el widget central "brilla a través". ¿Por qué es esto?


Aunque la sintaxis de la hoja de estilos no lo menciona, parece que la clase QWidget se trata de manera diferente cuando se trata de hojas de estilo.

Otros widgets funcionarán bien con su código de ejemplo. Por ejemplo, si QWidget se reemplaza en todas partes con QFrame , todo funciona como se espera.

Para obtener soporte de hojas de estilo para QWidget subclases de QWidget , necesita volver a paintEvent el paintEvent y habilitarlo explícitamente:

class BlackBar(QWidget): ... def paintEvent(self, event): option = QStyleOption() option.initFrom(self) painter = QPainter(self) self.style().drawPrimitive( QStyle.PE_Widget, option, painter, self)


El informe de errores ahora se ha respondido con una solución que es más fácil que la respuesta y el funcionamiento de @ ekhumoro:

No creo que esto sea válido. El código de pintura que está buscando no está dibujado en paintEvent . Busque QWidgetPrivate::paintBackground en QWidgetPrivate::paintBackground lugar. Por motivos de rendimiento, los widgets ignorarán las hojas de estilo de forma predeterminada, pero puede establecer el atributo WA_StyledBackground en el widget y debe respetar los fondos de la hoja de estilo.

Y, de hecho, hacer esto antes de configurar la hoja de estilo funciona:

self.setAttribute(Qt.WA_StyledBackground)