Получить предыдущее значение QComboBox, которое находится в QTableWidget, при изменении значения - PullRequest
4 голосов
/ 06 июля 2010

Скажем, у меня есть QTableWidget, и в каждом ряду есть QComboBox и QSpinBox.Предположим, что я сохраняю их значения QMap<QString /*Combo box val*/,int /*spin box val*/> theMap;

При изменении значения comboBoxe s или значения спин-боксов я хочу обновить theMap.Поэтому я должен знать, какое было прежнее значение поля со списком, чтобы заменить его новым значением comboBox, а также позаботиться о значении поля прокрутки.

Как я могу это сделать?

PS Я решил создать слот, в котором при нажатии на таблицу будет храниться текущее значение поля со списком этой строки.Но это работает только при нажатии на заголовок строки.В других местах (нажатие на combobox или spinbox) itemSelectionChanged() сигнал QTableWidget не работает.

Так что, в общем, моя проблема - сохранить значение поля со списком выбранной строки, и я получу ComboBox или SpinBox изменения даже и легко обработать theMap.

Ответы [ 4 ]

6 голосов
/ 06 июля 2010

Как насчет создания собственного, производного класса 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 вместо этого, что теперь дополнительно предоставляет старый текст поля со списком.

Надеюсь, это поможет.

4 голосов
/ 30 января 2012

Немного поздно, но у меня возникла та же проблема, и я решил ее следующим образом:

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;
};
0 голосов
/ 27 февраля 2019

У меня просто была похожая проблема, но для меня мне нужен был предыдущий индекс для чего-то очень тривиального, поэтому определение и реализация целого класса для него было неоправданным.

Поэтому вместо этого я сохранил аргумент, скажем, «предыдущий индекс», и обновил его значение только после того, как я сделал с ним все, что мне было нужно

0 голосов
/ 06 июля 2010

Мое предложение состоит в том, чтобы реализовать модель, которая помогла бы вам сделать четкое разделение между данными и пользовательским интерфейсом, редактирующим данные. Ваша модель получит уведомление о том, что данный модельный индекс (строка и столбец) изменился на новые данные, и вы сможете изменить любые другие данные, которые вам понадобятся в этот момент.

...