我有一个已经读取数据并将其放入TableView的应用程序,因此它看起来或多或少像这样:
我想添加一个像过滤器这样的电子表格,例如过滤掉特定公司的订单(没有正则表达式/通配符文本输入字段进行过滤)。
如何做到这一点?
答案 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
。
如果您受SQLite
或MySQL
或其他某些数据库的支持,请使用表模型示例,如果要对其进行过滤,请执行新查询。 (假设你的行数相对较少)。
希望有所帮助。