2010-02-20 19 views
6

Tôi đang sử dụng Qt4.5.2 trên Linux. Tôi có một QTableWidget đơn giản, trong đó một cột hiển thị ngày theo định dạng thân thiện với con người. Thật không may "ngày thân thiện với con người" không phải là dễ dàng để sắp xếp một cách chính xác. Vì vậy, trong QTableWidget tôi giữ một cột ẩn với dấu thời gian UNIX tương ứng với ngày đó.Làm thế nào để sắp xếp một QTableWidget với mã của riêng tôi?

Tôi đang cố gắng đảm bảo rằng, bất cứ khi nào yêu cầu sắp xếp trên cột DATE được ban hành, trong thực tế, sắp xếp được thực hiện trên cột TIMESTAMP (ẩn). Tôi đã cố gắng reimplementing sortByColumn (đây là bằng Python) bởi subclassing từ QTableWidget và xác định:

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

Tuy nhiên, bất cứ khi nào tôi bấm vào một trong các tiêu đề của bảng của tôi cách sắp xếp bình thường tiếp tục được gọi.

Làm cách nào để ghi đè?

Trả lời

7

Bạn có thể lấy được lớp của riêng mình là QTableWidgetItem và sau đó viết toán tử __lt__ của riêng bạn. Điều này sẽ làm giảm bớt nhu cầu cho một cột bổ sung là tốt. Một cái gì đó dọc theo dòng:

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

Điều này tạo ra kết quả chính xác cho tôi, bạn có thể tự mình chạy thử để xác minh. Văn bản ô hiển thị văn bản như "Thứ Bảy 20. Tháng 2 năm 2010" nhưng khi bạn sắp xếp trên cột, nó sẽ sắp xếp chính xác theo trường sortKey là "2010-02-20" (định dạng iso).

Ồ, cũng cần lưu ý rằng điều này sẽ KHÔNG hoạt động với PySide vì có vẻ như toán tử __lt__ không bị ràng buộc, ở đâu - như với PyQt4. Tôi đã dành một thời gian cố gắng để gỡ lỗi tại sao nó không hoạt động và sau đó tôi chuyển từ PySide sang PyQt4 và nó hoạt động tốt. Bạn có thể nhận thấy rằng các __lt__ không được liệt kê ở đây:

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

nhưng nó là ở đây:

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

+0

Xin chào, đây thực sự giúp tôi. Tôi cần toán tử '__lt__' của riêng mình để có thể sắp xếp các mục tablewidget có thể kiểm tra trong cột đầu tiên, nhưng bây giờ khi tôi sử dụng' tableWidget.setSortingEnabled (1) 'vì lý do nào đó' __lt__' được gọi là 100+ lần khi tôi có ~ 15 hàng, ngay cả khi tôi không nhấp vào tiêu đề của cột đó để sắp xếp nó. Vấn đề lớn hơn nữa là nó không sắp xếp nó ngay trong tình huống đó. một vài hàng có thể trộn lẫn tất cả, nhưng nó hoạt động tốt khi tôi nhấp vào tiêu đề. Có một số chức năng chặn mà chúng tôi truyền trong khi quá tải '__lt__' không? – Aleksandar

Các vấn đề liên quan