我有一个 QTableWidget,我通过标题列使用它的默认排序功能,但是我在 QTableWidget 中的一列是整数类型,并且通过 QTableWidget 默认排序,它被排序为字符串。所以有任何方法可以使用我自己的QTableWidget 的排序功能?
3 回答
您可以尝试继承 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);
[..]
我不确定,但我认为没有一种简单的方法可以改变 QTableWidget 的排序行为。
QTableWidget 只是 QTableView 的一个便利类,它使用默认模型。不能保证,但会尝试做什么:
QTableWidget 继承了 QTableView 的 model() 方法。有了它,您应该能够获得小部件的模型:
QAbstractItemModel *model = yourTableWidget->model();
这是最容易的部分。您现在需要一个 custom 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 的一个古老遗物。
你确定它没有很好地对数据进行排序吗?确保在那里添加数字,而不是字符串。因此,要将 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 会将其识别为整数并对其进行良好排序