У меня есть 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?
В конце концов я сделал это в своем коде 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
.
Если вы использовали QTreeView
с QStandardItemModel
, это было бы легко.
QStandardItem.setData
метки могут быть добавлены с помощью QStandardItem.setData
(с использованием настраиваемой роли), а затем ключ сортировки можно установить на модели с помощью QStandardItemModel.setSortRole
.
sorted(l1 + l2, key=lambda x: x.getTimestamp())
кажется правильным.