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

8 投票
3 回答
5337 浏览
提问于 2025-04-15 21:09

我在使用PyQt4的时候遇到了一些问题。我想在一个窗口里创建一个新的控件,并且希望这个控件有自定义的颜色。

当我创建一个QWidget类的子类并实例化它时,我无法通过setStyleSheet()函数来改变它的背景颜色。

如果我直接实例化一个新的QWidget对象,我可以顺利地改变它的背景颜色。但是我不想要一个普通的QWidget对象,我想创建我自己的QWidget子类。

当我创建一个QPushButton的子类时,我也能使用setStyleSheet()函数来改变它的背景颜色。

控制台窗口没有任何错误信息或警告,它就是不正常工作,也没有任何提示为什么会这样。

所以我想知道的是,为什么我可以改变一个QWidget对象的背景颜色,或者一个QPushButton的子类的背景颜色,但不能改变我自己创建的QWidget子类的背景颜色?我该如何改变这个QWidget子类对象的背景颜色呢?

这可能是因为我使用的Python或PyQt的版本问题吗?还是库里的一个bug?或者是我写代码的方式有问题?

我使用的是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 个回答

0

我现在没法测试这个,不过如果我没记错的话,我在给小部件类命名的时候遇到过问题,还有就是当我只添加一个样式属性时,使用{}分组也出过问题。

你可以试着运行你的代码,不过把你现在的内容换成:

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

如果你有多个属性的话,可以用:

self.setStyleSheet("background-color: #00FF00; color: #FFFFFF")
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)
6

我找到了一种解决办法,不知道是不是最好的,如果有人有其他建议,请留言告诉我。

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

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

撰写回答