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

时间:2011-07-22 03:54:49

标签: qt

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

我考虑过使用QSortFilterProxy模型,但QTableWidgetsetModel(...)方法设为私有,因此在这种情况下我无法使用QSortFilterProxy模型。请告诉我如何在QTable Widget中实现Filter选项

2 个答案:

答案 0 :(得分:17)

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

这是迭代所有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 );
}

答案 1 :(得分:16)

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

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

您需要做什么:

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

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