QTREewIdget inserttoleveliTem - فهرس معروض غير معروض بدقة في الشجرة؟

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

سؤال

أنا غير قادر على إدراج QtreewIdgetItem بشكل صحيح في فهرس معين ، وفي هذه الحالة أقوم بإزالة جميع QtreewIdgetItems من الشجرة ، وأقوم بعمل مخصص على كائنات التاريخ الخاصة بهم ثم إدخالها مرة أخرى في qtreewidget.

ومع ذلك ، عند إدخال (حتى واحد في وقت واحد) ، لا يتم إدراج QTreewIdgetItem في المكان الصحيح.

الرمز أدناه يطبع:

الفهرس 0: 0

الفهرس 0: 1 الفهرس 1: 0

الفهرس 0: 2 الفهرس 1: 1 الفهرس 2: 0

الفهرس 0: 3 الفهرس 1: 2 الفهرس 2: 0 الفهرس 3: 1

الفهرس 0: 4 الفهرس 1: 2 الفهرس 2: 0 الفهرس 3: 1 الفهرس 4: 3

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0])

self.insertTopLevelItem(0, childrenList[1])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1])

self.insertTopLevelItem(0, childrenList[2])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1]), ' index 2: ', \
    self.indexOfTopLevelItem(childrenList[2])

self.insertTopLevelItem(0, childrenList[3])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
    self.indexOfTopLevelItem(childrenList[1]), ' index 2: ',\
    self.indexOfTopLevelItem(childrenList[2]), 'index 3: ',\
    self.indexOfTopLevelItem(childrenList[3])

self.insertTopLevelItem(0, childrenList[4])

print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]),\
    ' index 1: ', self.indexOfTopLevelItem(childrenList[1]),\
    ' index 2: ', self.indexOfTopLevelItem(childrenList[2]),\
    'index 3: ', self.indexOfTopLevelItem(childrenList[3]),\
    'index 4: ', self.indexOfTopLevelItem(childrenList[4])
هل كانت مفيدة؟

المحلول

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

virtual QVariant data ( int column, int role ) const

عند إنشاء عنصر ، يمكنك تقديم بعض السلسلة إلى مُنشئ لعرض العنصر. يتم وضع هذه السلسلة في البيانات (.. ، qtcore.qt.editrole) ، لذلك ، فإن ما يعادل تمرير البيانات إلى الحكم هو تعيين البيانات مع:

virtual void setData ( int column, int role, const QVariant & value)

داخليًا ، البيانات ليست سوى صفيف ، يمكنك وضع أي شيء تريده ، وفهارسه هو أدوار (qt.editrole هو 2 ، qt.tooltiprole هو 3 وما إلى ذلك) ، لذلك ندع بعض الدورات احتواء بياناتنا ، وتروي المقارنة المشغل لمقارنة هذه القيم ، وإخبار مجموعة عرض SetData عندما نضعنا ، دعنا نقول ، الثمينة. ها هي العينة:

class TreeItem(QtGui.QTreeWidgetItem):

    PythonValueRole = QtCore.Qt.UserRole

    #values are list of python objects, that have __str__ and can be compared
    def __init__(self, tree, values):
        QtGui.QTreeWidgetItem.__init__(self, tree)
        i = 0
        for v in values:
            self.setData(i, TreeItem.PythonValueRole, v)
            i += 1

    #overridden to simplify data assigning. When called with PythonValueRole, passes
    #that object's string representation to DisplayRole and EditRole
    def setData(self, col, role, value):
        if role == TreeItem.PythonValueRole:
            QtGui.QTreeWidgetItem.setData(self, col, TreeItem.PythonValueRole, value)
            # sets DisplayRole and EditRole
            QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.EditRole, str(value)) 
            QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.DisplayRole, str(value))
        else:
            QtGui.QTreeWidgetItem.setData(self, col, role, value)

    def __lt__(self, other):
        c = self.treeWidget().sortColumn()
        return self.data(c, TreeItem.PythonValueRole).toPyObject() < 
               other.data(c, TreeItem.PythonValueRole).toPyObject()

لقد اختبرت ، يعمل بشكل جيد. من Cource ، يمكنك تجنب الميراث والتجاوز LT مباشرةً ، نظرًا لأننا كان لدينا كتابة البط ، استخدم Userrole نفسه للاحتفاظ ببياناتك ، وعرض البيانات مباشرة مع SetData (Col ، الدور ، VAL) ، أو حتى الاحتفاظ بنصوص فقط في دور التعديل/العرض وتحويلها في وقت فقط أثناء مقارنة ، لكنها تبدو قبيحة. لاحظ أن البيانات () تحتوي على QVariant. عندما تقوم بتعيين البيانات ، يحول كائن PY الخاص بك تلقائيًا ، وتحتاج إلى استدعاء TopyObject () لاستعادة القيمة الخاصة بك كما كانت.

نصائح أخرى

يجب أن تكون المشكلة في مكان آخر في الكود الخاص بك. ربما لا تزيل العناصر بشكل صحيح؟ لأن ما يلي يعمل:

import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *

app = QApplication(sys.argv)

tree = QTreeWidget()
items = [QTreeWidgetItem(['index %i' % i]) for i in range(5)]

for item in items:
    tree.insertTopLevelItem(0, item)

print 'indexes: '
for item in items:
    print tree.indexOfTopLevelItem(item),

tree.show()

app.exec_()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top