8

PyQt4 に問題があります。ウィンドウ内に新しいウィジェットを作成したいのですが、このウィジェットにカスタム カラーを設定したいと考えています。

QWidget クラスのサブクラスを作成してインスタンス化すると、setStyleSheet() 関数で背景色を変更できません。

新しい QWidget オブジェクトをインスタンス化するとき、背景色を変更しても問題ありません。しかし、普通の QWidget オブジェクトは必要ありません。QWidget の独自のサブクラスを作成したいと考えています。

QPushButton のサブクラスを作成すると、setStyleSheet() 関数を使用して背景色を変更することもできます。

コンソール ウィンドウにエラー メッセージや警告は表示されません。理由を示すことなく、正常に動作しないだけです。

だから私が知りたいのは、QWidgetオブジェクトまたはQPushButtonのサブクラスを作成するだけでウィジェットの背景色を変更できるのに、QWidgetのサブクラスを作成するときは変更できない理由です。QWidget のサブクラスであるオブジェクトの背景色を変更するにはどうすればよいですか?

私が使用しているpythonまたはPyQtのバージョンに固有のものでしょうか?ライブラリのバグですか?または、コードを書いている方法に欠陥がありますか?

私はpython 2.6.4とP​​yQt4を使用しています

以下は、私をトラブルに導くコードの例です。ウィンドウ内には 3 つのウィジェットが上下に並んでいます。親ウィジェットの背景色は緑に設定されています。一番上のウィジェットは赤に設定されており、真ん中のウィジェットは 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

今はこれをテストする場所ではありませんが、私の記憶が正しければ、ウィジェット クラスに名前を付けるときに問題がありました。また、スタイルシート属性を 1 つだけ追加するときに {} グループ化を使用するときにも問題がありました。

コードを実行してみてください。

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

または、複数の属性の場合は、次を使用します。

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