2012-03-19 9 views
4

私はQComboBoxを持っているので、ユーザーはモデル列のネットワーク名を使用できます。私はこのようなコードを使用しています:モデルにリンクされたQComboBoxに 'None'オプションを追加する

私はPySideを使用していますが、これは本当にQt質問です。 C++を使用した回答は問題ありません。

ネットワークを選択しないようにする必要があります。私がしたいのは、コンボボックスに「なし」という項目を追加することです。ただし、これはモデルの内容によってオーバーライドされます。

私は考えることができる唯一の方法は、このモデルの列の中間のカスタムビューを作成し、コンボを更新するためにそれを使用し、ビューは、余分な「魔法」アイテムに追加扱うことができることです。誰もこれを行うよりエレガントな方法を知っていますか?

答えて

3

可能な解決策の1つは、余分なアイテムを追加するために使用しているモデルをサブクラス化することです。実装は簡単です。あなたのモデルMyModelを呼び出す場合、サブクラスは(C++を使用)、次のようになります。

class MyModelWithNoneEntry : public MyModel 
{ 
public: 
    int rowCount() {return MyModel::rowCount()+1;} 
    int columnCount() {return MyModel::columnCOunt();} 
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const 
    { 
     if (index.row() == 0) 
     { 
      // if we are at the desired column return the None item 
      if (index.column() == NET_NAME && role == Qt::DisplayRole) 
        return QVariant("None"); 
      // otherwise a non valid QVariant 
      else 
        return QVariant(); 
     } 
     // Return the parent's data 
     else 
      return MyModel::data(createIndex(index.row()-1,index.col()), role);  
    } 

    // parent and index should be defined as well but their implementation is straight 
    // forward 
} 

今、あなたは、コンボボックスにこのモデルを設定することができます。

+0

ニート。私はそれを試してみましょう。 –

+0

メインモデルをサブクラス化するのではなく、実際には新しいQAbstractListModelサブクラスを作成しました。私はその後、メインモデルをコンストラクタに渡して、新しいモデルが既存のモデルのデータにアクセスできるようにしました。それでも、この答えは私を正しい道にしてくれました。それ以外の場合は、Orriginalモデルクラスのサブクラス化がうまくいくかもしれません。受け入れられました。 –

+0

答えがあなたを助けてくれてうれしいです。 – pnezis