python - setbackgroundcolor - Subclase pyQt4: QWidget no responde al nuevo color de fondo setStyleSheet()
rgb color qt (3)
Tengo un problema con PyQt4. Quiero crear un nuevo widget dentro de una ventana, y quiero que este widget tenga un color personalizado.
Cuando creo una subclase de la clase QWidget y la instancia, no puedo cambiar el color de fondo a través de la función setStyleSheet ().
Cuando instancia un nuevo objeto QWidget, no tengo problemas para cambiar el color de fondo. Pero no quiero un objeto ordinario de QWidget. Quiero crear mi propia subclase de QWidget.
Cuando creo una subclase de QPushButton, también puedo cambiar el color de fondo con la función setStyleSheet ().
No hay mensajes de error o advertencias en la ventana de la consola, simplemente se niega a funcionar correctamente sin ninguna indicación de por qué.
Entonces, lo que me gustaría saber es por qué puedo cambiar el color de fondo de un widget si simplemente creo un objeto QWidget o una subclase de QPushButton, pero no cuando creo una subclase de QWidget. ¿Y cómo puedo cambiar el color de fondo de un objeto que es una subclase de QWidget?
¿Es quizás algo específico de la versión de python o PyQt que estoy usando? ¿Es un error en la biblioteca? o algún defecto en la forma en que estoy escribiendo mi código?
Estoy usando Python 2.6.4 y PyQt4
A continuación se muestra un ejemplo del código que me lleva a problemas. Hay tres widgets dentro de la ventana uno debajo del otro. El widget padre se establece con el color de fondo de verde. El widget superior se establece en rojo, el medio, es la subclase de QWidget, que debe ser azul, pero parece invisible porque toma el color de la ventana principal por algún motivo. y el widget inferior es una subclase de QPushButton y es blanco.
import sys
from PyQt4 import QtGui, QtCore
################################################################################
#--------------------------------------------------------- CUSTOM WIDGET CLASS 1
class CustomWidget(QtGui.QWidget):
def __init__(self, parent):
QtGui.QWidget.__init__(self, parent)
# some custom properties and functions will follow
################################################################################
#--------------------------------------------------------- CUSTOM WIDGET CLASS 2
class CustomWidget2(QtGui.QPushButton):
def __init__(self, parent):
QtGui.QPushButton.__init__(self, parent)
# some custom properties and functions will follow
################################################################################
#----------------------------------------------------------- PARENT WIDGET CLASS
class Parent(QtGui.QWidget):
def __init__(self, parent=None):
#---------------------------------------------------------- SETUP WINDOW
QtGui.QWidget.__init__(self, parent)
self.resize(500, 340)
self.setStyleSheet("QWidget {background-color: #00FF00}")
#-------------------------------------------------- SETUP DEFAULT WIDGET
wid1 = QtGui.QWidget(self)
wid1.setGeometry(10, 10, 480, 100)
wid1.setStyleSheet("QWidget {background-color: #FF0000 }")
#------------------------------------------------- SETUP CUSTOM WIDGET 1
wid2 = CustomWidget(self)
wid2.setGeometry(10, 120, 480, 100)
wid2.setStyleSheet("QWidget {background-color: #0000FF }")
#------------------------------------------------- SETUP CUSTOM WIDGET 2
wid3 = CustomWidget2(self)
wid3.setGeometry(10, 230, 480, 100)
wid3.setStyleSheet("QWidget {background-color: #FFFFFF }")
################################################################################
#-------------------------------------------------------------------------- MAIN
app = QtGui.QApplication(sys.argv)
win = Parent()
win.show()
app.exec_()
Bueno, descubrí una solución, no sé si es la mejor o no, así que si alguien más tiene alguna sugerencia, por favor deje un comentario.
Al invocar los métodos show () y setAutoFillBackground (True) para el objeto de la subclase QWidget, puedo hacer que aparezcan los colores. p.ej:
wid2.setStyleSheet("QWidget {background-color: #0000FF }")
wid2.show()
wid2.setAutoFillBackground(True)
No estoy en un lugar para probar esto en este momento, pero si no recuerdo mal, tuve problemas al nombrar la clase de widget, y también cuando uso {} agrupación cuando solo estoy agregando un atributo de hoja de estilo.
Intenta ejecutar tu código, pero en lugar de lo que tienes, utiliza:
self.setStyleSheet("background-color: #00FF00")
O si son múltiples atributos, use:
self.setStyleSheet("background-color: #00FF00; color: #FFFFFF")
Según esto, cuando subclases QWidget tienes que implementar el controlador paintEvent .
class CustomWidget(QtGui.QWidget):
def __init__(self, parent):
QtGui.QWidget.__init__(self, parent)
# some custom properties and functions will follow
def paintEvent(self, event):
opt = QStyleOption()
opt.init(self)
painter = QPainter(self)
self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self)