QTableWidget中的自定义排序

时间:2013-09-06 00:55:04

标签: qt qtablewidget

我有一个QTableWidget,我通过标题列使用它的默认排序功能,但我在QTableWidget中的一个列是整数类型,通过QTableWidget默认排序它被排序为一个字符串。所以有任何方法我可以使用我自己的QTableWidget排序函数?

3 个答案:

答案 0 :(得分:4)

您可以尝试子类化QTableWidgetItem并重新实现它的运算符<()。比在你的QTableWidget中使用这个自定义项而不是默认的QTableWidgetItems。像这样:

class Item: public QTableWidgetItem
{

 public:
     [..]
     bool operator< (const QTableWidgetItem &other) const
     {
         // TODO: To be safe, check weather conversion to int is possible.
         return (this->text().toInt() < other.text().toInt());
     }
     [..]
 };

在你的表格小部件中:

[..]
QTableWidgetItem *newItem = new Item("1");
tableWidget->setItem(row, column, newItem);
[..]

答案 1 :(得分:0)

我不确定,但我认为没有一种简单的方法可以改变QTableWidget的排序行为。

QTableWidget只是QTableView的一个便利类,它使用默认模型。不能保证,但会尝试做什么:

QTableWidget从QTableView继承model()方法。有了它,您应该能够获得小部件的模型:

QAbstractItemModel *model = yourTableWidget->model();

这很容易。您现在需要自定义QSortFilterProxyModel,您可以在其中覆盖virtual bool lessThan(const QModelIndex & left, const QModelIndex & right) const方法。

最后:

YourCustomFilterProxyModel *proxyModel = new YourCustomFilterProxyModel(this);
proxyModel->setSourceModel(model);
yourTableWidget->setModel(proxyModel);

到目前为止还没有保证我从未尝试过替换QTableWidget中的默认模型。如果可能,您应该查看Qt视图和模型。最初它们看起来更难以使用,但是对它们感到满意是值得的。恕我直言QTableWidget只是Qt3的一个古老遗物。

答案 2 :(得分:0)

您确定它没有对数据进行排序吗?确保你在那里添加数字,而不是字符串。因此,要向QTableWidget行添加40,请使用以下数据:

36: {'firstname': 'b', 'lastname': '111', 'email': 'foo@gmail.com',
                     'affiliate': 'Stuart Little', 'total_account_value': 40},

而不是:

36: {'firstname': 'b', 'lastname': '111', 'email': 'foo@gmail.com',
                     'affiliate': 'Stuart Little', 'total_account_value': '40'},

QTableWidget会将其识别为整数并对其进行排序