QStyledItemDelegate مخصص:إضافة عناصر جريئة
-
05-07-2019 - |
سؤال
إذن هذه هي القصة:
لدي QListview يستخدم QSqlQueryModel لملئه.نظرًا لأن بعض العناصر يجب أن تظهر بالخط العريض بناءً على قيمة العمود المخفي للنموذج، فقد قررت إنشاء مفوض مخصص خاص بي.أنا أستخدم PyQT 4.5.4 وبالتالي فإن الوراثة من QStyledItemDelegate هي الطريقة التي يجب اتباعها وفقًا للمستندات.لقد قمت بتشغيله ولكن هناك بعض المشاكل به.
هذا هو الحل الخاص بي:
class TypeSoortDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
model = index.model()
record = model.record(index.row())
value= record.value(2).toPyObject()
if value:
painter.save()
# change the back- and foreground colors
# if the item is selected
if option.state & QStyle.State_Selected:
painter.setPen(QPen(Qt.NoPen))
painter.setBrush(QApplication.palette().highlight())
painter.drawRect(option.rect)
painter.restore()
painter.save()
font = painter.font
pen = painter.pen()
pen.setColor(QApplication.palette().color(QPalette.HighlightedText))
painter.setPen(pen)
else:
painter.setPen(QPen(Qt.black))
# set text bold
font = painter.font()
font.setWeight(QFont.Bold)
painter.setFont(font)
text = record.value(1).toPyObject()
painter.drawText(option.rect, Qt.AlignLeft, text)
painter.restore()
else:
QStyledItemDelegate.paint(self, painter, option, index)
المشاكل التي أواجهها الآن:
- the normal (not bold) items are slightly indented (a few pixels). This is probably some default behaviour. I could indent my item in bold also, but what happens then under a different platform?
- عادةً عندما أقوم بتحديد العناصر، يكون هناك حد صغير به خط منقط حوله (شيء Windows الافتراضي؟).هنا أيضًا يمكنني رسمها، لكني أريد أن أبقى أصليًا قدر الإمكان.
والآن السؤال:
هل هناك طريقة أخرى لإنشاء مندوب مخصص يغير وزن الخط فقط عند استيفاء بعض الشروط ويترك الباقي دون تغيير؟
لقد حاولت أيضًا:
if value:
font = painter.font()
font.setWeight(QFont.Bold)
painter.setFont(font)
QStyledItemDelegate.paint(self, painter, option, index)
ولكن لا يبدو أن هذا يؤثر على المظهر على الإطلاق.لا يوجد خطأ، فقط السلوك الافتراضي، ولا توجد عناصر غامقة.
جميع الاقتراحات موضع ترحيب!
المحلول
لم أختبر هذا، ولكن أعتقد أنه يمكنك القيام بما يلي:
class TypeSoortDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
get value...
if value:
option.font.setWeight(QFont.Bold)
QStyledItemDelegate.paint(self, painter, option, index)
لا تنتمي إلى StackOverflow