2010-07-06 5 views
4

Dites que j'ai un QTableWidget et que dans chaque ligne il y a un QComboBox et un QSpinBox. Considérer que je stocke leurs valeurs est un QMap theMap;Récupère la valeur précédente de QComboBox, qui se trouve dans un QTableWidget, lorsque la valeur est modifiée

Lorsque la valeur des comboBoxes est sélectionnée ou que la valeur est modifiée, la valeur est en cours de modification. Je souhaite mettre à jour "theMap". Donc, je devrais savoir quelle était la valeur précédente de la zone de liste déroulante afin de remplacer avec la nouvelle valeur de la zone de liste déroulante et aussi prendre soin de la valeur de la boîte de spin.

Comment est-ce que je peux faire ceci?

P.S. J'ai décidé de créer un emplacement que lorsque vous cliquez sur une table, il stocke la valeur actuelle de la zone de liste déroulante de cette ligne. Mais cela ne fonctionne que lorsque vous appuyez sur la légende de la ligne. À d'autres endroits (en cliquant sur une zone de liste déroulante ou sur une boîte de sélection), le signal itemSelectionChanged() de QTableWidget ne fonctionne pas. Donc, en général, mon problème est de stocker la valeur de la zone de liste déroulante de la ligne sélectionnée, et le ComboBox ou SpinBox me changera même et traitera "theMap" facilement.

Répondre

6

Que diriez-vous de créer votre propre, classe dérivée de QComboBox, quelque chose le long des lignes de:

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

Et puis juste se connecter à la place myTextChangedSignal, qui fournit désormais plus l'ancien texte de zone de liste déroulante.

J'espère que cela aide.

+0

Ceci est bien sûr, mais comment je peux comprendre les lignes zone de liste déroulante (ou boîte de spin) a été modifiée? – Narek

0

Ma suggestion consiste à implémenter un modèle, ce qui vous aiderait à faire une séparation nette entre les données et l'interface utilisateur modifiant les données. Votre modèle recevrait alors un message indiquant qu'un index de modèle donné (ligne et colonne) était remplacé par les nouvelles données, et que vous pouviez modifier toutes les autres données dont vous aviez besoin à ce moment-là.

4

Un peu en retard, mais j'ai eu le même problème et résolu de cette façon:

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

C'est une manière intelligente et simple. – user1899020

Questions connexes