pyQt4:QWidget子类不响应新的setStyleSheet()背景颜色

8
我遇到了关于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个回答

6

好的,我发现了一个解决方案,我不知道它是否是最好的,如果有其他人有任何建议,请留言。

通过调用QWidget子类对象的show()setAutoFillBackground(True)方法,我可以让颜色显示出来。例如:

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

2
根据这里的内容,当你继承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)

初始化opt应该是opt.initFrom(self) - Algorys

0

目前无法测试,但如果我记得正确的话,当命名小部件类时会出现问题,以及在只添加一个样式表属性时使用{}分组。

尝试运行您的代码,但不要使用您已有的内容,而是使用:

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

或者如果有多个属性,可以使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接