Domanda

Sto avendo un problema con PyQt4. Voglio creare un nuovo widget all'interno di una finestra, e voglio questo widget per avere un colore personalizzato.

Quando creo una sottoclasse della classe QWidget, e un'istanza, io non sono in grado di cambiare il colore di sfondo attraverso la funzione setStyleSheet ().

Quando ho un'istanza di un nuovo oggetto QWidget, non ho problemi a cambiare il suo colore di sfondo. Ma non voglio un normale QWidget object.I vuole creare la mia propria sottoclasse di QWidget.

Quando creo una sottoclasse di un QPushButton, sono anche in grado di cambiare il colore di sfondo usando 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 pitone o PyQt che sto usando? Si tratta di 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 di codice che mi porta a guai. Ci sono tre i widget all'interno della finestra uno sotto l'altro. Il genitore widget viene impostato con il colore di sfondo verde. La parte superiore widget è impostato su rosso, quello centrale, è la sottoclasse di QWidget, che dovrebbe essere blu, ma sembra invisibile perché assume il colore della finestra padre per qualche motivo. e il widget di fondo è 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_()
È stato utile?

Soluzione

Bene, 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 (vero) metodi per la QWidget sottoclasse oggetto, posso ottenere i colori di presentarsi. ad esempio:

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

Altri suggerimenti

questo quando si sottoclasse QWidget è necessario implementare il paintEvent handler.

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)

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 il suo più attributi, utilizzare:

self.setStyleSheet("background-color: #00FF00; color: #FFFFFF")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top