如何在 Qt TableView 中实现像过滤一样的电子表格?

Posted

技术标签:

【中文标题】如何在 Qt TableView 中实现像过滤一样的电子表格?【英文标题】:How can I implement spreadsheet like filtering in Qt TableView? 【发布时间】:2014-10-20 22:27:11 【问题描述】:

我有一个已经读取数据并将其放入 TableView 的应用程序,所以它看起来或多或少像这样:

我想添加一个类似过滤器的电子表格,例如过滤掉来自特定公司的订单(没有用于过滤的正则表达式/通配符文本输入字段)。

如何做到这一点?

【问题讨论】:

【参考方案1】:

使用 QSortFilterProxyModel

http://qt-project.org/doc/qt-4.8/qsortfilterproxymodel.html

你需要重新实现 bool QSortFilterProxyModel::filterAcceptsRow(int sourceRow);

没有看到你的模型,我无法给你确切的细节,但你重新实现的过滤器看起来像这样:

class myFilter : public QSortFilterProxyModel

    Q_OBJECT
public:
    myFilter( QObject* parent = NULL );
    virtual ~myFilter();

    virtual bool filterAcceptsRow( int sourceRow ) 
    
        const QAbstractTableModel* myModel = dynamic_cast<QAbstractTableModel*>( sourceModel() );
        if ( myModel->companyByRowOkay( sourceRow )  
            return true;
        

        return false;

    


private:
;

设置如下:

QAbstractTableModel* Model = new QAbstractTableModel();
myFilter* Filter = new myFilter();
QTableView* View = new QTableView();

proxy->setSourceModel( Model );
view->setModel( proxy );

你明白了。通常 QSortFilterProxyModel 位于模型和委托之间,因此如果您直接从委托与模型对话,则需要记住这一点,因为索引会有所不同。

编辑:还要阅读有关何时在 QSortFilterProxyModel 中调用 invalidate() 的信息,否则您可能会把头发拉出来。

【讨论】:

【参考方案2】:

http://qt-project.org/doc/qt-5/qtablewidget.html#sortItems

void QTableWidget::sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder)

根据表格对表格小部件中的所有行进行排序 列和顺序。

http://qt-project.org/doc/qt-5/qtsql-tablemodel-example.html

至于过滤,您可能需要自己开发一种可以进行过滤的弹出窗口小部件。

也许添加一个QContextMenu 并绘制一个复选框列表,该列表包含它可以在该列中找到的所有项目。看看 Excel 或 LibreOffice Calc 是如何做到的,并模仿设计。

然后单击复选框或单击弹出窗口上的“确定”,快速浏览所有行并将行高设置为零或隐藏该行,或隐藏该行中的所有QTableWidgetItems。

如果您受到SQLitemysql 或其他数据库的支持,请使用表模型示例并在您想要过滤它时执行新查询。 (假设您的行数相对较少)。

希望对您有所帮助。

【讨论】:

以上是关于如何在 Qt TableView 中实现像过滤一样的电子表格?的主要内容,如果未能解决你的问题,请参考以下文章

QT如何实现QSqltablemodel实时更新数据库,并在tableview中实时显示,

如何在 react-router-dom 中实现像 vue-router 这样的路由器离开保护?

不使用线程的 C++/Qt 线程错误

如何在Qt 中实现单例模式

[Qt]自定义表头实现过滤功能

如何在 tableView 单元格中实现收藏按钮?