如何在QTableWidget中设置筛选选项

15
在我的应用程序中,我有一个显示多行的QtableWidget,一个文本框和一个按钮。要求是点击按钮后,同一个QTableWidget只显示那些在文本框中输入了字符串的行。 我考虑使用QSortFilterProxy模型,但QTableWidget具有私有的setModel(...)方法,因此我无法在这种情况下使用QSortFilterProxy模型。请告诉我如何在QTable Widget中实现筛选选项。
2个回答

27

对于这种情况,使用排序/筛选代理可能过度了。

你只需要迭代所有的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 );
}

请您能否给我一些示例代码,以便我能够理解您的方法。提前感谢您。 - john
凭我的经验,它可能看起来像这样: - Chris
4
我们可以使用 QTableWidget.findItems(criteria, Qt.MatchContains) 来查找与 criteria 匹配的单元格,并返回一个列表。 - swdev

27

我强烈建议按照以下方式进行操作!这是在Qt中完成的方式。

查看 Qt Model/View Programming教程。问题在于,QTableWidget是一个为您隐藏Model/View内容的方便类。在您的情况下,您不能(或不应该)忽略Qt提供的Model/View结构。

你需要做的:

  1. 使用QTableView而不是QTableWidget
  2. 继承QAbstractItemModel并实现data()(用于读取)和您从文档中需要的所有其他函数。这是最棘手的部分,但请参考上面的链接,了解如何完成此操作。
  3. 创建QSortFilterProxyModel并将QTableViewsetModel()设置为它。
  4. QSortFilterProxyModelsetSourceModel()设置为您子类化的模型。
  5. 使用setFilterFixedString()setFilterRegExp()在您的QSortFilterProxyModel中设置要过滤的字符串

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


1
我强烈支持这个 ;)事情往往从简单开始,但在某些时候,你不仅会遇到其他“蛮力”方法的障碍,而且可能需要更多的工作来重新实现模型/视图方法。换句话说:如果某些东西过于复杂(如上所述),则无法在开始时判断... - t_3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接