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 unQHBoxLayout
. Dentro de eso:- Dos
QLabels
- Dos
- Un
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
. BusqueQWidgetPrivate::paintBackground
enQWidgetPrivate::paintBackground
lugar. Por motivos de rendimiento, los widgets ignorarán las hojas de estilo de forma predeterminada, pero puede establecer el atributoWA_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)