如何合并和排序QTreeWidgetItem的两个排序列表?

时间:2011-11-08 17:00:18

标签: python qt qt4 pyqt pyqt4

我有一个QTreeWidget和一堆QTreeWidgetItems。每个QTreeWidgetItem都有一个QDateTime形式的时间戳。 QTreeWidget按时间戳排序。我有另一个QTreeWidgetItems列表,它也按时间戳排序。我想将这个QTreeWidgetItems列表添加到我的QTreeWidget中,最后在QTreeWidget中使用QTreeWIdgetItems的组合排序列表。

目前,这就是我如何组合两个QTreeWidgetItems列表:

    #1
    #self is my QTreeWidget class
    numItems = self.topLevelItemCount()
    #items is the new list of QTreeWIdgetItems to be added
    numAddItems = len(items)

    if numAddItems == 0:
        return

    while addItemIndex < numAddItems:
        addItem = items[addItemIndex]

        if itemIndex < numItems:
            item = self.topLevelItem(itemIndex)
            addItemDateTime = items[addItemIndex].getTimestamp()
            itemDateTime = item.getTimestamp()
            if addItemDateTime < itemDateTime:
                self.insertTopLevelItem(itemIndex, addItem)
                addItemIndex += 1
        else:
            self.addTopLevelItem(addItem)
            addItemIndex += 1
        itemIndex += 1
        numItems = self.topLevelItemCount()

我知道要合并和排序两个Python列表,我可以这样做:

>>> l1 = [1, 3, 4, 7]  
>>> l2 = [0, 2, 5, 6, 8, 9]  
>>> sorted(l1 + l2)  
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我知道QTreeWidget有一个sortItems()方法。我如何告诉QTreeWidget使用QDateTime进行排序?

我也可以这样做:

#2
#self is a QTreeWidget
#get a list of all the QTreeWidgetItems in the QTreeWidget
currentItems = []
numItems = self.topLevelItemCount()
for i in range(numItems):
    currentItems.append(self.topLevelItem(i))
#clear the QTreeWidget
self.clear()
#perform a merge sort on the list of all the QTreeWidgetItems
items = self.mergesort(currentItems + newItems)
for item in items:
    self.addTopLevelItem(item)

那么结合我的两个QTreeWidgetItems列表的更好方法是什么?

2 个答案:

答案 0 :(得分:0)

如果您使用带有QStandardItemModelQTreeView,这很容易。

可以使用QStandardItem.setData(使用自定义角色)添加时间戳,然后可以使用QStandardItemModel.setSortRole在模型上设置排序键。

答案 1 :(得分:0)

我最终在我的Python代码中做到了这一点:

sortedItems = sorted(currentItems, key=lambda x: x.getTimestamp())

但是,我不得不用C ++重写应用程序,这就是我在C ++中所做的:

void TreeWidget::sortTreeWidgetItems(QVector<LogEvent *> currentItems) {
    qSort(currentItems.begin(), currentItems.end(), compareLogEventsByTimestampDesc);
}

bool compareLogEventsByTimestampDesc(LogEvent *eventA, LogEvent *eventB) {
    QDateTime aTimestamp = eventA->getTimestamp();
    QDateTime bTimestamp = eventB->getTimestamp();
    return (aTimestamp > bTimestamp);
}

LogEvent继承QTreeWidgetItem