PYQT4: فئة QWIDGET الفرعية لا تستجيب لتلويد الخلفية الجديد () لون الخلفية

StackOverflow https://stackoverflow.com/questions/2565963

سؤال

أواجه مشكلة في PYQT4. أرغب في إنشاء عنصر واجهة مستخدم جديدة داخل نافذة ، وأريد أن تحتوي هذه القطعة على لون مخصص.

عندما أقوم بإنشاء فئة فرعية من فئة QWIDGET ، وتثبيتها ، فأنا غير قادر على تغيير لون الخلفية من خلال وظيفة SetStyLesheet ().

عندما أقوم بتثبيت كائن QWidget جديد ، ليس لدي أي مشاكل في تغيير لون الخلفية. لكني لا أريد كائن QWidget عادي. أريد إنشاء فئة فرعية خاصة بي من QWidget.

عندما أقوم بإنشاء فئة فرعية من Qpushbutton ، فإنني أيضًا قادر على تغيير لون الخلفية باستخدام وظيفة SetStyLesheet ().

لا توجد رسائل خطأ أو تحذيرات في نافذة وحدة التحكم ، فهي ترفض العمل بشكل صحيح دون أي إشارة إلى السبب.

لذا فإن ما أود أن أعرفه هو لماذا يمكنني تغيير لون الخلفية للعناصر واجهة مستخدم إذا قمت ببساطة بإنشاء كائن QWidget ، أو فئة فرعية من Qpushbutton ، لكن لا عندما أقوم بإنشاء فئة فرعية من QWidget. وكيف يمكنني بالتالي تغيير لون خلفية كائن هو فئة فرعية من QWidget؟

هل ربما يكون شيء خاص بإصدار Python أو Pyqt الذي أستخدمه؟ هل هو خطأ في المكتبة؟ أو بعض العيب في الطريقة التي أكتب بها الكود الخاص بي؟

أنا أستخدم Python 2.6.4 و PYQT4

فيما يلي مثال على الكود الذي يقودني إلى المتاعب. هناك ثلاث أجهزة واجهة مستخدم داخل النافذة واحدة أسفل الأخرى. يتم تعيين أداة الوالد مع لون الخلفية من الأخضر. تم تعيين عنصر واجهة مستخدم أعلى على اللون الأحمر ، الأوسط ، هو الفئة الفرعية لـ 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 (صحيح) طرق كائن الفئة الفرعية QWidget ، يمكنني الحصول على الألوان لتظهر. على سبيل المثال:

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

نصائح أخرى

بالنسبة الى هذه عندما تقوم بالفئة الفرعية QWidget ، عليك تنفيذ ألم معالج.

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")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top