如何在QTableWidget中设置过滤器选项

joh*_*ohn 9 qt

在我的应用程序中,我QtableWidget显示了多行,行编辑以输入字符串和按钮,需要在点击按钮时说明相同QTableWidget应该只显示那些有字符串输入行编辑的行.

我想用的QSortFilterProxy模型,但是QTableWidget是有setModel(...)方法的私人,所以我不能使用QSortFilterProxy在这种情况下模型.请告诉我如何在QTable Widget中实现Filter选项

Chr*_*ris 19

无论如何,使用排序/过滤器代理可能是过度的.

这是迭代所有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 );
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,我们可以简单地使用`QTableWidget.findItems(criteria,Qt.MatchContains)`,它将返回与`criteria`相匹配的单元格列表 (2认同)

kev*_*818 17

我强烈建议以下列方式进行此操作!这就是它在Qt中的意图.

查看关于Qt模型/视图编程教程.问题是QTableWidget是一个方便的类,可以为你隐藏Model/View的东西.在您的情况下,您不能(或不应该)忽略Qt提供的模型/视图结构.

你需要做什么:

  1. 使用QTableView而不是a QTableWidget.
  2. 子类QAbstractItemModel和实现data()(用于阅读),以及文档中所需的所有其他功能.这是最棘手的部分,但请参阅上面的链接,了解如何执行此操作.
  3. 创建QSortFilterProxyModelsetModel()QTableView吧.
  4. setSourceModel()QSortFilterProxyModel的子类模型.
  5. 使用setFilterFixedString()setFilterRegExp()在您的中设置要过滤的字符串QSortFilterProxyModel

如果这有帮助,请告诉我.从长远来看,这是更专业,更优雅,而不是遍历表中的所有元素.