如何在Qt TableView中实现过滤等电子表格?

时间:2014-10-20 22:27:12

标签: qt filtering qt5 qtableview

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

enter image description here

我想添加一个像过滤器这样的电子表格,例如过滤掉特定公司的订单(没有正则表达式/通配符文本输入字段进行过滤)。

如何做到这一点?

2 个答案:

答案 0 :(得分:2)

使用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(),否则你可能会把头发拉出来。

答案 1 :(得分:1)

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如何做到这一点,并模仿设计。

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

如果您受SQLiteMySQL或其他某些数据库的支持,请使用表模型示例,如果要对其进行过滤,请执行新查询。 (假设你的行数相对较少)。

希望有所帮助。