pyQt4: подкласс QWidget не отвечает на новый цвет фона setStyleSheet () - PullRequest
7 голосов
/ 02 апреля 2010

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

Когда я создаю подкласс класса 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_()

Ответы [ 3 ]

5 голосов
/ 02 апреля 2010

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

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

    wid2.setStyleSheet("QWidget {background-color: #0000FF }")
    wid2.show()
    wid2.setAutoFillBackground(True)
2 голосов
/ 16 декабря 2015

В соответствии с этим при создании подкласса 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 голосов
/ 26 сентября 2014

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

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

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

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

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