2010-04-02 8 views
7

Ho un problema con PyQt4. Voglio creare un nuovo widget all'interno di una finestra e voglio che questo widget abbia un colore personalizzato.pyQt4: sottoclasse QWidget che non risponde al nuovo colore di sfondo setStyleSheet()

Quando creo una sottoclasse della classe QWidget e la istanziamo, non sono in grado di cambiare il colore di sfondo tramite la funzione setStyleSheet().

Quando istanzio un nuovo oggetto QWidget, non ho problemi a cambiare il colore di sfondo. Ma non voglio un oggetto QWidget ordinario. Voglio creare la mia sottoclasse di QWidget.

Quando creo una sottoclasse di un QPushButton, sono anche in grado di cambiare il colore dello sfondo utilizzando la funzione setStyleSheet().

Non ci sono messaggi di errore o avvisi nella finestra della console, si rifiuta semplicemente di funzionare correttamente senza alcuna indicazione sul perché.

Quindi quello che vorrei sapere è perché è che posso cambiare il colore di un widget sfondo, se ho semplicemente creare un oggetto QWidget, o di una sottoclasse di QPushButton, ma non quando creo una sottoclasse di QWidget . E come posso quindi cambiare il colore di sfondo di un oggetto che è una sottoclasse di QWidget?

E 'forse qualcosa di specifico per la versione di Python o PyQt che sto usando? È un bug nella libreria? o qualche difetto nel modo in cui sto scrivendo il mio codice?

Sto usando Python 2.6.4 e PyQt4

Di seguito è riportato un esempio del codice che mi porta a guai. Ci sono tre widget all'interno della finestra uno sotto l'altro. Il widget principale è impostato con il colore di sfondo verde. Il widget superiore è impostato su rosso, quello centrale, è la sottoclasse di QWidget, che deve essere blu, ma sembra invisibile perché assume il colore della finestra padre per qualche motivo. e il widget in basso è una sottoclasse di QPushButton ed è bianco.

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_() 

risposta

5

Beh, ho scoperto una soluzione, non so se è il migliore o no, quindi se qualcun altro ha qualche suggerimento, si prega di lasciare un commento.

Chiamando il show() e setAutoFillBackground (True) metodi per l'oggetto sottoclasse QWidget, posso ottenere i colori di presentarsi. ad esempio:

wid2.setStyleSheet("QWidget {background-color: #0000FF }") 
    wid2.show() 
    wid2.setAutoFillBackground(True) 
0

Non in un posto per testare questo momento, ma se non ricordo male, ho avuto problemi quando si nomina la classe del widget, e anche quando si utilizza {} raggruppamento quando im solo l'aggiunta di un attributo di stile.

provare a eseguire il codice, ma invece di quello che hai, l'uso:

self.setStyleSheet("background-color: #00FF00") 

o se la sua più attributi, uso:

self.setStyleSheet("background-color: #00FF00; color: #FFFFFF") 
2

Secondo this quando si sottoclasse QWidget si deve implementare il gestore 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) 
+0

L'inizializzazione per opt deve essere "opt.initFrom (self)". – Algorys

Problemi correlati