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

3 回答 3

6

好吧,我发现了一个解决方案,我不知道它是否最好,所以如果其他人有任何建议,请发表评论。

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

    wid2.setStyleSheet("QWidget {background-color: #0000FF }")
    wid2.show()
    wid2.setAutoFillBackground(True)
于 2010-04-02T10:33:30.100 回答
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)
于 2015-12-15T22:29:35.090 回答
0

现在没有地方测试这个,但如果我没记错的话,我在命名小部件类时遇到了问题,并且在我只添加一个样式表属性时使用 {} 分组时也遇到了问题。

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

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

或者,如果它有多个属性,请使用:

self.setStyleSheet("background-color: #00FF00; color: #FFFFFF")
于 2014-09-26T19:01:36.970 回答