PyQt4 - 未显示小部件

时间:2010-01-04 16:11:05

标签: python pyqt pyqt4 qwidget

我用Python和Qt4制作了这个程序。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


color = QtGui.QColor(99, 0, 0)

class colorButton(QtGui.QWidget):
    def __init__(self, args):
        QtGui.QWidget.__init__(self,args)
        self.setGeometry(150, 22, 50, 50)
        self.setStyleSheet("QWidget { background-color: %s }" % color.name())

class ColorDialog(QtGui.QWidget):
    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(40, 40, 220, 100)
        self.setWindowTitle('ColorDialog')

        button=colorButton(self)


app = QtGui.QApplication(sys.argv)
cd = ColorDialog()
cd.show()
app.exec_()

解释器不会给我任何错误,但不会显示“彩色”小部件。为什么? 谢谢

4 个答案:

答案 0 :(得分:4)

您的班级colorButton继承自QWidget,但您在构造函数中调用了QPushButton.__init__()。也许你希望它继承自QPushButton

通过使用以下类定义,您的代码适用于我:

class colorButton(QtGui.QPushButton):
    def __init__(self, *args):
        QtGui.QPushButton.__init__(self, *args)
        self.setGeometry(150, 22, 50, 50)
        self.setStyleSheet("QWidget { background-color: %s }" % color.name())

答案 1 :(得分:2)

您需要为窗口小部件提供paintEvent。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


color = QtGui.QColor(99, 0, 0)

class colorButton(QtGui.QWidget):
    def __init__(self, args):
        QtGui.QWidget.__init__(self,args)
        self.setGeometry(150, 22, 50, 50)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.fillRect(event.rect(), color)

class ColorDialog(QtGui.QWidget):
    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(40, 40, 220, 100)
        self.setWindowTitle('ColorDialog')

        button=colorButton(self)


app = QtGui.QApplication(sys.argv)
cd = ColorDialog()
cd.show()
app.exec_()

答案 2 :(得分:0)

在更改颜色之前尝试将autoFillBackground设置为True(在setStylesheet调用之前)。而且我认为你需要设置托盘。此注释假定您的意思是“未显示窗口小部件的颜色”。请查看语法,如下图所示为Qt4.3,我没有检查最新的语法。设置托盘后,无需设置样式表。

class colorButton(QtGui.QWidget)
    def __init__(self, args):
        QtGui.QPushButton.__init__(self,args)
        self.setGeometry(150, 22, 50, 50)


    self.setAutoFillBackground(True)
    plt = QtGui.QPalette()      
    plt.setColor(QtGui.QPalette.Active,QtGui.QPalette.Window,color)
    plt.setColor(QtGui.QPalette.Inactive,QtGui.QPalette.Window,color)  
    plt.setColor(QtGui.QPalette.Disabled,QtGui.QPalette.Window,color
    self.setPalette(plt) 


    #self.setStyleSheet("QWidget { background-color: %s }" % color.name())

答案 3 :(得分:0)

我认为您需要使用

为ColorDialog提供布局
self.setLayout(SOME_LAYOUT)

然后将您的按钮添加到布局中,例如

self.layout().addItem(button)

否则,我不确定是否只需将ColorDialog作为父级按钮,就足以显示。