2010-02-20 30 views
6

Linux'ta Qt4.5.2 kullanıyorum. Bir sütunun insan dostu bir biçimde tarihleri ​​gösterdiği basit bir QTableWidget var. Ne yazık ki "insan dostu tarihler" doğru sıralamak için kolay değildir. Yani, QTableWidget içinde bu tarihe karşılık gelen UNIX zaman damgası ile gizli bir sütun tutuyorum.QTableWidget'i kendi kodumla nasıl sıralayabilirim?

DATE sütununda sıralama isteğinde bulunulduğunda, gerçekte bu türün (görünmez) TIMESTAMP sütununda yapılması gerektiğinden emin olmaya çalışıyorum. Ben QTableWidget gelen sınıflara ve tanımlayarak sortByColumn (bu Python olan) reimplementing çalıştı:

def sortByColumn(self, col, order): 
     print 'got request to sort col %d in order %s' % (col, str(order)) 

Oysa ben, normal sıralama yöntemi denir edilmeye devam benim tablonun başlıklarından biri tıkladığında.

Nasıl geçersiz kılabilirim?

cevap

7

Kendi sınıfınızı QTableWidgetItem türetebilir ve daha sonra kendi __lt__ operatörünüzü yazabilirsiniz. Bu, ekstra bir sütun ihtiyacını da hafifletir. Bir şey satırları: Bu benim için doğru sonuçlar üretmiştir

from PyQt4 import QtCore, QtGui 
import sys 
import datetime 

class MyTableWidgetItem(QtGui.QTableWidgetItem): 
    def __init__(self, text, sortKey): 
     #call custom constructor with UserType item type 
     QtGui.QTableWidgetItem.__init__(self, text, QtGui.QTableWidgetItem.UserType) 
     self.sortKey = sortKey 

    #Qt uses a simple < check for sorting items, override this to use the sortKey 
    def __lt__(self, other): 
     return self.sortKey < other.sortKey 

app = QtGui.QApplication(sys.argv) 
window = QtGui.QMainWindow() 
window.setGeometry(0, 0, 400, 400) 

table = QtGui.QTableWidget(window) 
table.setGeometry(0, 0, 400, 400) 
table.setRowCount(3) 
table.setColumnCount(1) 

date1 = datetime.date.today() 
date2 = datetime.date.today() + datetime.timedelta(days=1) 
date3 = datetime.date.today() + datetime.timedelta(days=2) 

item1 = MyTableWidgetItem(str(date1.strftime("%A %d. %B %Y")), str(date1)) 
item2 = MyTableWidgetItem(str(date2.strftime("%A %d. %B %Y")), str(date2)) 
item3 = MyTableWidgetItem(str(date3.strftime("%A %d. %B %Y")), str(date3)) 

table.setItem(0, 0, item1) 
table.setItem(2, 0, item2) 
table.setItem(1, 0, item3) 
table.setSortingEnabled(True) 

window.show() 
sys.exit(app.exec_()) 

, kendinizi doğrulamak için çalıştırabilirsiniz. Hücre metninde "Cumartesi 20 Şubat 2010" gibi bir metin görüntülenir, ancak sütunu sıraladığınızda "2010-02-20" (iso formatlı) olan sortKey alanı tarafından doğru şekilde sıralanır.

Ah, aynı zamanda daha __lt__ operatör bağlı olmadığını belirledik çünkü bu PySide ile ÇALIŞMAYACAKTIR unutulmamalıdır nereye-gibi PyQt4 beraberdir. Bir süre çalışmama nedenini ayıklamaya çalıştım ve PySide'den PyQt4'e geçtim ve iyi çalıştı. Bu gerçekten bana yardımcı oldu,

http://doc.qt.digia.com/4.5/qtablewidgetitem.html#operator-lt

+0

Yüksek:

http://www.pyside.org/docs/pyside/PySide/QtGui/QTableWidgetItem.html

ama burada şudur: __lt__ burada listelenen olmadığını fark edebilirsiniz. Ben kendi '__lt__' operatörüne ihtiyacım vardı, böylece ilk sütunda kontrol edilebilir tablewidget öğelerini sıralayabilirim, fakat şimdi 'tablewidget.setSortingEnabled (1)' kullandığımda '__lt__', ~ 15 satır olduğunda 100+ kere çağrılıyor sıralamak için o sütunun başlığına tıklamamış olsa bile. Daha büyük sorun bile, bu durumda onu doğru sıralamamasıdır. Birkaç satır hepsi bu kadar karışık, ama ben üstbilgi tıklandığında iyi çalışır. '__lt__' aşırı yüklenirken geçirdiğimiz bazı engelleme işlevleri var mı? – Aleksandar

İlgili konular