PyQt4 - виджет не отображается

Я сделал эту программу на 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_()

Интерпретатор не выдает никаких ошибок, но "цветной" виджет не отображается. Почему? благодарить


person Lopoc    schedule 04.01.2010    source источник
comment
class colorButton(QtGui.QWidget) отсутствует ':', но это приведет к SyntaxError...   -  person miku    schedule 04.01.2010
comment
В Python имена классов обычно начинаются с заглавной буквы.   -  person Georg Schölly    schedule 05.01.2010


Ответы (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())
person Ferdinand Beyer    schedule 04.01.2010
comment
Я исправил в обоих случаях объект QtGui.Qwidget , но не сейчас! все равно не появляется - person Lopoc; 04.01.2010
comment
Я не знаю, что вы делаете, но когда я запускаю ваш код после замены определения colorButton, я вижу коричневую кнопку. - person Ferdinand Beyer; 04.01.2010
comment
Ну, это работает, но я не хочу QPushButton. Я намеренно использую объект QWidget. - person Lopoc; 04.01.2010
comment
Вероятно, вам следует использовать super(colorButton, self).__init__(self, *args). - person Georg Schölly; 05.01.2010

Вам нужно дать виджету 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_()
person Jesse Aldridge    schedule 04.01.2010

Попробуйте установить для 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())
person apt    schedule 04.01.2010

Я думаю, вам нужно дать вашему ColorDialog макет, используя

self.setLayout(SOME_LAYOUT)

затем добавьте свою кнопку в макет с чем-то вроде

self.layout().addItem(button)

В противном случае я не уверен, что для отображения достаточно просто указать кнопку ColorDialog в качестве родителя.

person Community    schedule 04.01.2010