Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Qt TableView中实现类似电子表格的过滤?_Qt_Filtering_Qt5_Qtableview - Fatal编程技术网

如何在Qt TableView中实现类似电子表格的过滤?

如何在Qt TableView中实现类似电子表格的过滤?,qt,filtering,qt5,qtableview,Qt,Filtering,Qt5,Qtableview,我有一个应用程序,它已经读取了数据,并将其放在TableView中,所以它看起来或多或少像这样: 我想添加一个类似电子表格的过滤器,例如过滤掉特定公司的订单(没有用于过滤的正则表达式/通配符文本输入字段) 如何做到这一点? void QTableWidget::sortItems(int列,Qt::SortOrder顺序= Qt::AscendingOrder) 根据对表格小部件中的所有行进行排序 列和顺序 至于过滤,您可能需要拿出自己的弹出窗口小部件来进行过滤 也许可以添加一个QConte

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

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

如何做到这一点?

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 );