[PyQt] How to make sort working when click the column

David Cortesi davecortesi at gmail.com
Fri May 16 01:55:20 BST 2014


 不坏阿峰 <onlydebian at gmail.com> writes,

> i have use Qtablewidget to display my data.

while in the tablewidget it is store like string.

when click the column ,it sort by alphabetical order  not by numerically.
>

QTableWidget and QTableView implement a simple alphanumeric sort of
strings. It is not even locale-aware.

To sort in a different way, for example to sort on numeric value, I think
you must leave the QTableWidget, go to QTableView and then add a
QSortFilterProxyModel. There is an example (in C++ of course) here:

http://qt-project.org/doc/qt-5/qtwidgets-itemviews-customsortfiltermodel-example.html

You must make a subclass of QSortFilterProxyModel in which you write your
own method lessThan(left,right). In this method you compare any two table
items from one column, and return True if the item at the "left" model
index is less than the model at the "right" model index.

In this code you can, for example, convert strings to integers or to float
or to date-time and compare them in that format.

The following is NOT TESTED, but gives the general idea.

> class mySortFilterProxy(QSortFilterProxyModel):
>    def __init__(self, parent=None):
>        super().__init__(parent)
>    # compare table elements of column 2 as float numbers
>    def lessThan(self, left, right):
>        if left.column() == 2 :
>            return float(self.sourceModel().data(left)) <
float(self.sourceModel().data(right))
>        # not column 2, compare as strings
>        return self.sourceModel().data(left) <
self.sourceModel().data(right)

I found this one of the most confusing parts of the Qt Model/View
architecture. Good luck.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20140515/33045dbd/attachment.html>


More information about the PyQt mailing list