如何在 Qt TableView 中实现像过滤一样的电子表格?
Posted
技术标签:
【中文标题】如何在 Qt TableView 中实现像过滤一样的电子表格?【英文标题】:How can I implement spreadsheet like filtering in Qt TableView? 【发布时间】:2014-10-20 22:27:11 【问题描述】:我有一个已经读取数据并将其放入 TableView 的应用程序,所以它看起来或多或少像这样:
我想添加一个类似过滤器的电子表格,例如过滤掉来自特定公司的订单(没有用于过滤的正则表达式/通配符文本输入字段)。
如何做到这一点?
【问题讨论】:
【参考方案1】:使用 QSortFilterProxyModel
http://qt-project.org/doc/qt-4.8/qsortfilterproxymodel.html
你需要重新实现 bool QSortFilterProxyModel::filterAcceptsRow(int sourceRow);
没有看到你的模型,我无法给你确切的细节,但你重新实现的过滤器看起来像这样:
class myFilter : public QSortFilterProxyModel
Q_OBJECT
public:
myFilter( QObject* parent = NULL );
virtual ~myFilter();
virtual bool filterAcceptsRow( int sourceRow )
const QAbstractTableModel* myModel = dynamic_cast<QAbstractTableModel*>( sourceModel() );
if ( myModel->companyByRowOkay( sourceRow )
return true;
return false;
private:
;
设置如下:
QAbstractTableModel* Model = new QAbstractTableModel();
myFilter* Filter = new myFilter();
QTableView* View = new QTableView();
proxy->setSourceModel( Model );
view->setModel( proxy );
你明白了。通常 QSortFilterProxyModel 位于模型和委托之间,因此如果您直接从委托与模型对话,则需要记住这一点,因为索引会有所不同。
编辑:还要阅读有关何时在 QSortFilterProxyModel 中调用 invalidate() 的信息,否则您可能会把头发拉出来。
【讨论】:
【参考方案2】:http://qt-project.org/doc/qt-5/qtablewidget.html#sortItems
void QTableWidget::sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder)
根据表格对表格小部件中的所有行进行排序 列和顺序。
http://qt-project.org/doc/qt-5/qtsql-tablemodel-example.html
至于过滤,您可能需要自己开发一种可以进行过滤的弹出窗口小部件。
也许添加一个QContextMenu
并绘制一个复选框列表,该列表包含它可以在该列中找到的所有项目。看看 Excel 或 LibreOffice Calc 是如何做到的,并模仿设计。
然后单击复选框或单击弹出窗口上的“确定”,快速浏览所有行并将行高设置为零或隐藏该行,或隐藏该行中的所有QTableWidgetItem
s。
如果您受到SQLite
或mysql
或其他数据库的支持,请使用表模型示例并在您想要过滤它时执行新查询。 (假设您的行数相对较少)。
希望对您有所帮助。
【讨论】:
以上是关于如何在 Qt TableView 中实现像过滤一样的电子表格?的主要内容,如果未能解决你的问题,请参考以下文章
QT如何实现QSqltablemodel实时更新数据库,并在tableview中实时显示,