pyQt4:QWidget サブクラスが新しい setStyleSheet() 背景色に応答しない
-
23-09-2019 - |
質問
PyQt4 で問題が発生しています。ウィンドウ内に新しいウィジェットを作成し、このウィジェットにカスタム カラーを設定したいと考えています。
QWidget クラスのサブクラスを作成してインスタンス化すると、setStyleSheet() 関数を使用して背景色を変更できません。
新しい QWidget オブジェクトをインスタンス化するときに、その背景色を問題なく変更できます。しかし、普通の QWidget オブジェクトは必要ありません。QWidget の独自のサブクラスを作成したいと考えています。
QPushButton のサブクラスを作成するとき、setStyleSheet() 関数を使用して背景色を変更することもできます。
コンソール ウィンドウにはエラー メッセージや警告は表示されず、理由が示されずに適切に動作することを拒否するだけです。
それで、私が知りたいのは、QWidgetオブジェクト、またはQPushButtonのサブクラスを作成するだけで、なぜウィジェットの背景色を変更できるのかということです。 だがしかし QWidget のサブクラスを作成するとき。それでは、QWidget のサブクラスであるオブジェクトの背景色を変更するにはどうすればよいでしょうか?
それは私が使用しているPythonまたはPyQtのバージョンに固有のものなのでしょうか?ライブラリのバグでしょうか?それともコードの書き方に何か欠陥があるのでしょうか?
私はPython 2.6.4とPyQt4を使用しています
以下は、問題を引き起こすコードの例です。ウィンドウ内には 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_()
解決
さて、解決策を見つけましたが、それが最善かどうかはわかりません。他の誰かが提案を持っている場合は、コメントを残してください。
電話をかけることで、 見せる() そして setAutoFillBackground(True) QWidget サブクラス オブジェクトのメソッドを使用すると、表示する色を取得できます。例えば:
wid2.setStyleSheet("QWidget {background-color: #0000FF }")
wid2.show()
wid2.setAutoFillBackground(True)
他のヒント
あなたサブクラス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)
未今これをテストする代わりに、しかし、私の記憶が正しければ、ウィジェットクラスに名前を付けるときに、また、イムは一つだけのスタイルシート属性を追加する際にグループ化{}を使用しているとき、私は問題を持っています。
あなたのコードを実行してみてください、代わりにあなたが持っているものを、使用します:
self.setStyleSheet("background-color: #00FF00")
またはその複数の属性の場合、使用します:
self.setStyleSheet("background-color: #00FF00; color: #FFFFFF")