在QTableWidget中进行自定义排序

3

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

3个回答

5

您可以尝试对QTableWidgetItem进行子类化,并重新实现其operator<()。然后在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
我尝试过了,但是不起作用。当QTableWidget被排序时,似乎永远不会调用QTableWidgetItem::operator <()。 - Andy Brice
2
我的错误。我覆盖了这个:bool operator< ( const MyTableWidgetItem& rhs ) const; ,但我应该覆盖这个:bool operator< ( const QTableWidgetItem& rhs ) const; 。我的错误。 - Andy Brice
@AndyBrice非常感谢您!我犯了同样的错误,多亏了您,我终于找到了它! - Ian Rehwinkel

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中的一个古老遗物。


这样做行不通,因为QTableWidget中的setModel()是私有的。 - Anton N. Petrov
@AntonN.Petrov 私有虚函数并不是问题。它在基类中是公共的。因此,通过基类指针调用此函数根本不应该是问题。 - ovanes

0
你确定它没有正确地排序数据吗?确保你添加的是数字,而不是字符串。因此,要将40添加到QTableWidget行中,你需要使用以下数据:
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 会将其识别为整数并进行良好的排序


1
当我将整数值插入到QTableWidget中时,它根本不显示这些值。 - Oshada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接