当QTableWidget中的QComboBox值发生变化时,获取其之前的值

6
假设我有一个QTableWidget,在每一行中都有一个QComboBox和一个QSpinBox。考虑到我将它们的值存储在一个QMap theMap;中。
当comboBox或spin boxes的值被更改时,我想要更新theMap。因此,我应该知道combo box的前一个值,以便用comboBox的新值替换,并注意spin box的值。
我该怎么做呢?
附言:我已经决定创建一个槽,当您单击表格时,它会存储该行组合框的当前值。但是仅当您按行标题时才有效。在其他地方(单击combobox或spinbox)QTableWidget的itemSelectionChanged()信号不起作用。
因此,总体上我的问题是要存储所选行的组合框的值,然后我将获得ComboBox或SpinBox更改事件,并轻松处理theMap。
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,现在它还提供了旧的组合框文本。

希望这有所帮助。


当然,这很好,但我如何知道哪些行的组合框(或旋转框)已被编辑? - Narek
如果“旧文本”是初始项目列表的一部分,并且现在是第一次选择它,则此方法将无效。 - bparker

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;
};

1
这是一种聪明而简单的方式。 - user1899020
1
当然,这仅在用户使用鼠标选择了一个项目时才有效。 - bparker

0
我的建议是实现一个模型,它将帮助您在数据和编辑数据的 UI 之间实现清晰的分离。然后,您的模型将被通知给定的模型索引(行和列)已更改为新数据,并且您可以在此时更改任何其他数据。

0

我遇到了类似的问题,但是我只需要先前的索引来执行一些非常琐碎的操作,所以定义和实现一个整个类是不合适的。

因此,我做的是保留一个名为“previousIndex”的参数,并在执行所有必要操作后仅更新其值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接