如何过滤QComboBox的数据
我有一个表格控件,每一行里都插入了一个下拉框,这些下拉框的数据来源是一样的。我希望当用户从一个下拉框中选择了一个项目后,其他下拉框就不能再找到这个项目。
1 个回答
1
希望你对C++的语法有一定了解。
- 首先,创建一个项目模型(适用于所有的下拉框),用你的数据来填充QComboBox(比如,可以基于
QStandardItemModel
来实现)。 - 接着,声明一个自定义的用户角色(
const int ComboIdRole = Qt::UserRole + 1;
)。这个角色用来保存下拉框中选中项的“ID”。 - 然后,创建一个自定义的过滤模型(基于
QSortFilterProxyModel
),在这个模型中保存“ComboID”,并重新实现filterAcceptsRow
方法:
const int ComboIdRole = Qt::UserRole + 1; class ComboProxyModel : public QSortFilterProxyModel { //... public: ComboProxyModel( QComboBox *view ) : QSortFilterProxyModel( view ) { m_id = (quint64)view; // Or any id, must be uniqe for each combobox } private: quint64 m_id; bool filterAcceptsRow( int source_row, const QModelIndex& source_parent ) { const QModelIndex idx = source_parent.child( source_row, 0 ); const quint64 itemId = idx.data( ComboIdRole ).toULongLong(); if ( itemId != 0 ) { if ( itemId != m_id ) // Do not accept if item is already selected return false; // and skip current combobox } return true; } };
- 每个QComboBox创建一个过滤模型,并将这个模型设置为下拉框的数据源。
- 当选择项发生变化时,你需要给选中的项目设置必要的角色。同时,别忘了把未选中的项目的角色设置为0。
- 这样就完成了!
主要概念是:使用Qt的MVC(模型 + 过滤模型),并将其设置为QComboBox的数据源。
附注:stackoverflow的格式有点问题 :(