Как я могу объединить и отсортировать два отсортированных списка QTreeWidgetItems? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть QTreeWidget с кучей QTreeWidgetItems.Каждый QTreeWidgetItem имеет временную метку в форме QDateTime.QTreeWidget отсортирован по метке времени.У меня есть другой список QTreeWidgetItems, который также отсортирован по отметке времени.Я хочу добавить этот список QTreeWidgetItems в мой QTreeWidget и в итоге объединить отсортированный список QTreeWIdgetItems в QTreeWidget.

В настоящее время я объединяю два списка 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 голосов
/ 09 июля 2012

Я в конечном итоге сделал это в своем коде 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.

0 голосов
/ 09 ноября 2011

Если бы вы использовали QTreeView с QStandardItemModel, это было бы легко.

Временные метки можно добавить с помощью QStandardItem.setData (с использованием пользовательской роли), а затем ключ сортировки можно установить в модели с помощью QStandardItemModel.setSortRole.

...