2011-11-08 10 views
1

私はQTreeWidgetItemsの束を持つQTreeWidgetを持っています。各QTreeWidgetItemにはQDateTimeの形式のタイムスタンプがあります。 QTreeWidgetはタイムスタンプでソートされます。タイムスタンプでソートされたQTreeWidgetItemsの別のリストがあります。私はこのQTreeWidgetItemsのリストをQTreeWidgetに追加し、QTreeWidgetのQTreeWIdgetItemsのソートされたリストを結合して終了します。QTreeWidgetItemのソートされた2つのリストをマージしソートする方法はありますか?

現在のところ、これは私がQTreeWidgetItemsの二つのリストを組み合わせています方法です:私は2つのPythonのリストをマージしてソートすることを知っている

#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() 

、私はこのような何かを行うことができます。

>>> 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の私の二つのリストを結合するためのより良い方法は何でしょう:私はまた、このような何かを行うことができ

+1

私はチェックしていませんが、 'sorted(l1 + l2、key = lambda x:x.getTimestamp())'が正しいと感じます。 –

答えて

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

関連する問題