Search code examples
qtfilterqtablewidget

How to implement a filter option in QTableWidget


In my application, I have QTableWidget displaying multiple rows, a line edit to enter a string and a push button.

The requirement says, upon clicking on the push button, the same QTableWidget should show only rows which contain the string entered into the line edit.

I thought of using a QSortFilterProxyModel, but QTableWidget has setModel(...) method private, so I am unable to use QSortFilterProxyModel in this case.


Solution

  • Using a sort/filter proxy is probably overkill for this anyway.

    It's a matter of iterating through all of your QTableWidgetItem objects, determining if their text matches the filter and calling QTableView::setRowHidden() as needed.

    For example:

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