6

假设我有 aQTableWidget并且在每一行中都有 aQComboBox和 a QSpinBox。考虑到我存储它们的值是QMap<QString /*Combo box val*/,int /*spin box val*/> theMap;

comboBoxes 值或旋转框值被更改时,我想更新theMap。所以我应该知道组合框的旧值是什么,以便用新的值替换comboBox并注意旋转框的值。

我怎样才能做到这一点?

PS 我决定创建一个插槽,当您单击表格时,它会存储该行组合框的当前值。但这仅在您按下行标题时才有效。在其他地方(单击 acombobox或 a spinboxitemSelectionChanged()信号QTableWidget不起作用。

所以总的来说,我的问题是存储所选行的组合框的值,我会得到ComboBoxSpinBox改变,并且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 回答
0

我只是遇到了类似的问题,但对我来说,我需要以前的索引来做一些非常琐碎的事情,因此为它定义和实现整个类是不合理的。

所以我所做的是保留一个名为 say 'previousIndex' 的参数,并且只有在我完成了我需要的所有操作后才更新它的值

于 2019-02-27T20:38:56.620 回答