【问题标题】:Custom Sorting in QTableWidgetQTableWidget 中的自定义排序
【发布时间】:2013-09-06 00:55:03
【问题描述】:

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

【问题讨论】:

    标签: qt qtablewidget


    【解决方案1】:

    您可以尝试继承 QTableWidgetItem 并重新实现它的 operator

    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 进行排序时,似乎永远不会调用 QTableWidgetItem::operator
    • 我的错误。我覆盖了这个: bool operator
    • @AndyBrice 非常感谢您!我犯了同样的错误,多亏了你,我终于找到了!
    【解决方案2】:

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

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

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

    QAbstractItemModel *model = yourTableWidget->model();
    

    这是最简单的部分。您现在需要一个自定义的QSortFilterProxyModel,您可以在其中覆盖virtual bool lessThan(const QModelIndex &amp; left, const QModelIndex &amp; right) const 方法。

    最后:

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

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

    【讨论】:

    • 这行不通,因为 setModel() 在 QTableWidget 中是私有的。
    【解决方案3】:

    您确定它没有很好地对数据进行排序吗?确保在那里添加数字,而不是字符串。因此,要将 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 会将其识别为整数并对其进行良好排序

    【讨论】:

    • 当我向 QTableWidget 插入整数值时,它根本不显示值
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2022-11-24
    • 2016-05-07
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多