如何在QTableWidget中实现过滤选项

问题描述 投票:0回答:2

在我的应用程序中,我有

QTableWidget
显示多行、用于输入字符串的行编辑和一个按钮。

要求表示,单击按钮后,相同的

QTableWidget
应仅显示包含输入到行编辑中的字符串的行。

我想过使用

QSortFilterProxyModel
,但是
QTableWidget
有私有的
setModel(...)
方法,所以在这种情况下我无法使用
QSortFilterProxyModel

qt filter qtablewidget
2个回答
28
投票

无论如何,使用排序/过滤代理可能有点过分了。

这是迭代所有 QTableWidgetItem 对象,确定它们的文本是否与过滤器匹配并根据需要调用 QTableView::setRowHidden() 的问题。

例如:

QString filter = textEdit->text();
for( int i = 0; i < table->rowCount(); ++i )
{
    bool match = false;
    for( int j = 0; j < table->columnCount(); ++j )
    {
        QTableWidgetItem *item = table->item( i, j );
        if( item->text().contains(filter) )
        {
            match = true;
            break;
        }
    }
    table->setRowHidden( i, !match );
}

27
投票

我强烈建议您按照以下方式解决此问题!这就是 Qt 中应该做的事情。

查看Qt 模型/视图编程教程。问题是 QTableWidget 是一个方便的类,它为您隐藏了模型/视图的内容。在您的情况下,您不能(或不应该)忽略 Qt 提供的模型/视图结构。

您需要做什么:

  1. 使用
    QTableView
    代替
    QTableWidget
  2. 子类
    QAbstractItemModel
    并实现
    data()
    (供阅读),以及 文档 中您需要的所有其他功能。这是最棘手的部分,但请参阅上面的链接以了解如何执行此操作的演练。
  3. 为其创建一个
    QSortFilterProxyModel
    setModel()
    QTableView
  4. 将您的
  5. setSourceModel()
    QSortFilterProxyModel
    添加到您的子类模型。
  6. 使用
    setFilterFixedString()
     中的 
    setFilterRegExp()
    QSortFilterProxyModel
  7. 设置要过滤的字符串

请告诉我这是否有帮助。这比迭代表中的所有元素要专业得多,而且从长远来看,也更优雅。

© www.soinside.com 2019 - 2024. All rights reserved.