我在每一行都有一个 tableWidget,我插入一个具有相同数据源的组合框,我希望当用户从组合框中选择一个项目时,它不会在其他组合框中找到
最佳答案
我希望您熟悉 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 创建 1 个过滤模型。并将此模型设置为组合框的源。
- 在选择更改信号时,您应该为所选项目设置必要的角色。并且不要忘记将 0 设置为未选择的项目。
- 利润!
主要概念 - 使用Qt MVC(模型+过滤模型)并将其设置为QComboBox的源模型
附注stackoverflow 格式有问题:(
关于python - 如何过滤QComboBox的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454264/