在我的应用程序中,我有
QTableWidget
显示多行、用于输入字符串的行编辑和一个按钮。
要求表示,单击按钮后,相同的
QTableWidget
应仅显示包含输入到行编辑中的字符串的行。
我想过使用
QSortFilterProxyModel
,但是QTableWidget
有私有的setModel(...)
方法,所以在这种情况下我无法使用QSortFilterProxyModel
。
无论如何,使用排序/过滤代理可能有点过分了。
这是迭代所有 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 模型/视图编程教程。问题是 QTableWidget 是一个方便的类,它为您隐藏了模型/视图的内容。在您的情况下,您不能(或不应该)忽略 Qt 提供的模型/视图结构。
您需要做什么:
QTableView
代替 QTableWidget
。QAbstractItemModel
并实现 data()
(供阅读),以及 文档 中您需要的所有其他功能。这是最棘手的部分,但请参阅上面的链接以了解如何执行此操作的演练。QSortFilterProxyModel
和 setModel()
的 QTableView
。setSourceModel()
的
QSortFilterProxyModel
添加到您的子类模型。setFilterFixedString()
中的
setFilterRegExp()
或
QSortFilterProxyModel
请告诉我这是否有帮助。这比迭代表中的所有元素要专业得多,而且从长远来看,也更优雅。