如何过滤QComboBox的数据

1 投票
1 回答
1160 浏览
提问于 2025-04-17 22:39

我有一个表格控件,每一行里都插入了一个下拉框,这些下拉框的数据来源是一样的。我希望当用户从一个下拉框中选择了一个项目后,其他下拉框就不能再找到这个项目。

1 个回答

1

希望你对C++的语法有一定了解。

  1. 首先,创建一个项目模型(适用于所有的下拉框),用你的数据来填充QComboBox(比如,可以基于QStandardItemModel来实现)。
  2. 接着,声明一个自定义的用户角色(const int ComboIdRole = Qt::UserRole + 1;)。这个角色用来保存下拉框中选中项的“ID”。
  3. 然后,创建一个自定义的过滤模型(基于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;
  }
};
  1. 每个QComboBox创建一个过滤模型,并将这个模型设置为下拉框的数据源。
  2. 当选择项发生变化时,你需要给选中的项目设置必要的角色。同时,别忘了把未选中的项目的角色设置为0。
  3. 这样就完成了!

主要概念是:使用Qt的MVC(模型 + 过滤模型),并将其设置为QComboBox的数据源。

附注:stackoverflow的格式有点问题 :(

撰写回答