6

と がQTableWidgetあり、各行に と があるQComboBoxとしQSpinBoxます。それらの値がQMap<QString /*Combo box val*/,int /*spin box val*/> theMap;

s の値またはスピン ボックスの値が変更されている場合comboBoxeは、更新したいと思いtheMapます。そのため、コンボ ボックスの以前の値を新しい値に置き換えcomboBox、スピン ボックスの値を処理する必要があります。

これどうやってするの?

PS テーブルをクリックすると、その行のコンボ ボックスの現在の値が格納されるスロットを作成することにしました。ただし、これは行キャプションを押した場合にのみ機能します。combobox他の場所 (または をクリックspinbox)itemSelectionChanged()の信号はQTableWidget機能しません。

したがって、一般的に私の問題は、選択した行のコンボボックスの値を保存することであり、取得ComboBoxまたはSpinBox変更してtheMap簡単に処理できます。

4

4 に答える 4

8

次のような独自の派生 QComboBox クラスを作成するのはどうですか。

class MyComboBox : public QComboBox
{
  Q_OBJECT
private:
  QString _oldText;
public:
  MyComboBox(QWidget *parent=0) : QComboBox(parent), _oldText() 
  {
    connect(this,SIGNAL(editTextChanged(const QString&)), this, 
        SLOT(myTextChangedSlot(const QString&)));
    connect(this,SIGNAL(currentIndexChanged(const QString&)), this, 
        SLOT(myTextChangedSlot(const QString&)));
  }
private slots:
  myTextChangedSlot(const QString &newText)
  {
    emit myTextChangedSignal(_oldText, newText);
    _oldText = newText;
  }
signals:
  myTextChangedSignal(const QString &oldText, const QString &newText);  
};

そして、myTextChangedSignal代わりに接続するだけで、古いコンボ ボックスのテキストが追加で提供されるようになりました。

それが役立つことを願っています。

于 2010-07-06T08:26:25.440 に答える
5

少し遅れましたが、私は同じ問題を抱えていて、この方法で解決しました:

class CComboBox : public QComboBox
{
   Q_OBJECT

   public:
      CComboBox(QWidget *parent = 0) : QComboBox(parent) {}


      QString GetPreviousText() { return m_PreviousText; }

   protected:
      void mousePressEvent(QMouseEvent *e)
      { 
         m_PreviousText = this->currentText(); 
         QComboBox::mousePressEvent(e); 
      }

   private:
      QString m_PreviousText;
};
于 2012-01-30T14:58:33.500 に答える
0

私の提案は、データとデータを編集するUIを明確に分離するのに役立つモデルを実装することです。次に、特定のモデルインデックス(行と列)が新しいデータに変更されたことがモデルに通知され、その時点で必要な他のデータを変更できます。

于 2010-07-06T17:37:41.933 に答える