首页 文章

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

提问于
浏览
7

我遇到了PyQt4的问题 . 我想在窗口中创建一个新的小部件,我希望这个小部件具有自定义颜色 .

当我创建QWidget类的子类并实例化它时,我无法通过setStyleSheet()函数更改其背景颜色 .

当我实例化一个新的QWidget对象时,我在更改其背景颜色方面没有任何问题 . 但我不想要一个普通的QWidget对象 . 我想创建自己的QWidget子类 .

当我创建QPushButton的子类时,我也可以使用setStyleSheet()函数更改其背景颜色 .

控制台窗口中没有错误消息或警告,它只是拒绝正常工作而没有任何关于原因的指示 .

所以我想知道的是,为什么我可以改变窗口小部件的背景颜色,如果我只是创建一个QWidget对象,或QPushButton的子类, but not 当我创建QWidget的子类时 . 那我怎么能改变作为QWidget子类的对象的背景颜色呢?

它可能是我正在使用的python或PyQt版本特有的东西吗?这是库中的错误吗?或者我编写代码的方式有些缺陷?

我使用的是python 2.6.4和PyQt4

以下是导致我遇到麻烦的代码示例 . 窗口内有三个小部件,一个在另一个之下 . 父窗口小部件的背景颜色为绿色 . 顶部小部件设置为红色,中间的小部件是QWidget的子类, should be 蓝色,但它看起来不可见,因为它出于某种原因呈现父窗口的颜色 . 底部小部件是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

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

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

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

    根据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)
    
  • 2

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

    尝试运行代码,但不要使用以下代码:

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

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

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

相关问题