如何过滤QComboBox的数据

时间:2014-03-17 12:28:02

标签: python qt pyqt pyqt4

我在每一行都有一个qtableWidget我插入了一个组合框,当我从组合框中选择一个在其他组合框中找不到的项目时,我想要的数据源相同

1 个答案:

答案 0 :(得分:1)

我希望您熟悉C ++语法。

  1. 使用您的QComboBox数据创建一个项目模型(对于alll组合框)(例如,基于QStandardItemModel
  2. 声明自定义用户角色(const int ComboIdRole = Qt::UserRole + 1;)。它将保留我们的ID"组合框,选择项目。
  3. 创建自定义过滤器模型(基于QSortFilterProxyModel),您将保留" ComboID"并重新实现filterAcceptsRow方法:
  4. 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创建1个过滤模型。并将此模型设置为组合框的源。
    2. 在选择更改信号上,您应设置为所选项目必要角色。并且不要忘记将0设置为未选择的项目。
    3. 利润!
    4. 主要概念 - 使用Qt MVC(model + filteringModel)并将其设置为QComboBox的源模型

      P.S。 stackoverflow格式化是错误的:(