在我的应用程序中,我有一个显示多行的QtableWidget,一个文本框和一个按钮。要求是点击按钮后,同一个QTableWidget只显示那些在文本框中输入了字符串的行。
我考虑使用QSortFilterProxy模型,但QTableWidget具有私有的setModel(...)方法,因此我无法在这种情况下使用QSortFilterProxy模型。请告诉我如何在QTable Widget中实现筛选选项。
对于这种情况,使用排序/筛选代理可能过度了。
你只需要迭代所有的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 );
}
我强烈建议按照以下方式进行操作!这是在Qt中完成的方式。
查看 Qt Model/View Programming教程。问题在于,QTableWidget是一个为您隐藏Model/View内容的方便类。在您的情况下,您不能(或不应该)忽略Qt提供的Model/View结构。
你需要做的:
QTableView
而不是QTableWidget
。QAbstractItemModel
并实现data()
(用于读取)和您从文档中需要的所有其他函数。这是最棘手的部分,但请参考上面的链接,了解如何完成此操作。QSortFilterProxyModel
并将QTableView
的setModel()
设置为它。QSortFilterProxyModel
的setSourceModel()
设置为您子类化的模型。setFilterFixedString()
或setFilterRegExp()
在您的QSortFilterProxyModel
中设置要过滤的字符串如果这有所帮助,请告诉我。这比迭代您的表中的所有元素要专业得多,而且从长远来看更加优雅。
QTableWidget.findItems(criteria, Qt.MatchContains)
来查找与criteria
匹配的单元格,并返回一个列表。 - swdev