【问题标题】:Get previous value of QComboBox, which is in a QTableWidget, when the value is changed获取QTableWidget中QComboBox的前一个值,当值改变时
【发布时间】:2010-07-06 07:45:14
【问题描述】:

假设我有一个QTableWidget,每一行都有一个QComboBox 和一个QSpinBox。考虑到我存储它们的值是QMap<QString /*Combo box val*/,int /*spin box val*/> theMap;

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

我该怎么做?

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

所以一般来说我的问题是存储所选行的组合框的值,我会得到ComboBoxSpinBox的变化,并且会轻松处理theMap

【问题讨论】:

    标签: c++ qt combobox spinner qtablewidget


    【解决方案1】:

    如何创建自己的派生 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,它现在还提供旧的组合框文本。

    希望对你有帮助。

    【讨论】:

    • 这当然很好,但是我如何才能理解哪些行组合框(或旋转框)已被编辑?
    • 如果“旧文本”是初始项目列表的一部分并且刚刚被第一次选中,这将不起作用。
    【解决方案2】:

    有点晚了,但我遇到了同样的问题并以这种方式解决了:

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

    【讨论】:

    • 这是一个聪明而简单的方法。
    • 当然,这仅在用户使用鼠标选择项目时才有效。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-05-27
        • 2020-06-26
        • 2019-09-23
        • 1970-01-01
        • 2016-02-29
        • 2015-06-26
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        相关资源
        最近更新 更多