如何在Qt TableView中实现类似电子表格的过滤?
我有一个应用程序,它已经读取了数据,并将其放在TableView中,所以它看起来或多或少像这样: 我想添加一个类似电子表格的过滤器,例如过滤掉特定公司的订单(没有用于过滤的正则表达式/通配符文本输入字段) 如何做到这一点?如何在Qt TableView中实现类似电子表格的过滤?,qt,filtering,qt5,qtableview,Qt,Filtering,Qt5,Qtableview,我有一个应用程序,它已经读取了数据,并将其放在TableView中,所以它看起来或多或少像这样: 我想添加一个类似电子表格的过滤器,例如过滤掉特定公司的订单(没有用于过滤的正则表达式/通配符文本输入字段) 如何做到这一点? void QTableWidget::sortItems(int列,Qt::SortOrder顺序= Qt::AscendingOrder) 根据对表格小部件中的所有行进行排序 列和顺序 至于过滤,您可能需要拿出自己的弹出窗口小部件来进行过滤 也许可以添加一个QConte
void QTableWidget::sortItems(int列,Qt::SortOrder顺序=
Qt::AscendingOrder)
根据对表格小部件中的所有行进行排序
列和顺序
至于过滤,您可能需要拿出自己的弹出窗口小部件来进行过滤
也许可以添加一个QContextMenu
,该菜单将显示一组复选框,其中包含在该列中可以找到的所有项目。看看Excel或LibreOffice Calc是如何做到这一点的,并模仿设计
然后单击复选框或单击弹出窗口上的OK,快速浏览所有行并将行高设置为零或隐藏行,或隐藏该行中的所有QTableWidgetItem
s
如果有SQLite
或MySQL
或其他数据库支持,请使用表模型示例,如果要对其进行筛选,请执行新查询。(假设您的行数相对较少)
希望有帮助。使用QSortFilterProxyModel 你需要重新实现 boolqsortfilterproxymodel::filterAcceptsRow(intsourcerow) 在没有看到您的模型的情况下,我无法向您提供确切的详细信息,但您重新实现的过滤器将如下所示:
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:
};
你明白了。通常,QSortFilterProxyModel位于模型和代理之间,因此如果您曾经直接从代理与模型交谈,您需要记住这一点,因为索引将不同
编辑:还要阅读何时在QSortFilterProxyModel中调用invalidate(),否则您可能会脱发
QAbstractTableModel* Model = new QAbstractTableModel();
myFilter* Filter = new myFilter();
QTableView* View = new QTableView();
proxy->setSourceModel( Model );
view->setModel( proxy );