2010-04-02 6 views
7

У меня проблема с PyQt4. Я хочу создать новый виджет в окне, и я хочу, чтобы этот виджет имел собственный цвет.pyQt4: подкласс QWidget не отвечает на новый цвет setStyleSheet()

Когда я создаю подкласс класса QWidget и создаю его экземпляр, я не могу изменить его цвет фона с помощью функции setStyleSheet().

Когда я создаю экземпляр нового объекта QWidget, у меня нет проблем с изменением его цвета фона. Но я не хочу обычный объект QWidget. Я хочу создать свой собственный подкласс QWidget.

Когда я создаю подкласс QPushButton, я также могу изменить его цвет фона с помощью функции setStyleSheet().

В окне консоли отсутствуют сообщения об ошибках или предупреждения, они просто отказываются работать должным образом, не указав причины.

Так что я хотел бы знать, почему это, что я могу изменить цвет фона виджета, если я просто создать объект QWidget, или подкласс QPushButton, но не когда я создать подкласс QWidget , И как я могу изменить цвет фона для объекта, который является подклассом QWidget?

Возможно, это что-то конкретное для версии python или PyQt, которую я использую? Это ошибка в библиотеке? или какой-то недостаток в том, как я пишу свой код?

Я использую Python 2.6.4 и PyQt4

Ниже приведен пример кода, который приводит меня к неприятностям. Внутри окна есть три виджета один за другим. Родительский виджет устанавливается с цветом фона зеленого цвета. Верхний виджет установлен на красный, средний - подкласс QWidget, который должен быть синий, но он кажется невидимым, потому что по какой-то причине он занимает цвет родительского окна. а нижний виджет - подкласс QPushButton и белый.

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

ответ

5

Ну, я обнаружил решение, я не знаю, если его лучший один или нет, так что если кто-то имеет какие-либо предложения, пожалуйста, оставьте комментарий.

Называя шоу() и setAutoFillBackground (True) методы объекта подкласса QWidget, я могу получить цвета, чтобы показать. например:

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

не в месте, чтобы проверить это прямо сейчас, но если я правильно помню, я имел проблемы при именовании класса виджета, а также при использовании {} группирования, когда им только при добавлении одного атрибута таблицы стилей.

Попробуйте запустить свой код, но вместо того, что у вас есть, используйте:

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

Или, если его многочисленных атрибутов, использование:

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

Согласно this, когда подкласс QWidget вы должны реализовать 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

Инициатор для opt должен быть 'opt.initFrom (self)' вместо этого. – Algorys