2009-08-26 6 views
14

Une cellule de chaque rangée d'un QTableWidget contient une comboboxSélection QComboBox dans QTableWidget

for (each row in table ...) { 
    QComboBox* combo = new QComboBox();  
    table->setCellWidget(row,col,combo);    
    combo->setCurrentIndex(node.type());     
    connect(combo, SIGNAL(currentIndexChanged(int)),this, SLOT(changed(int))); 
    .... 
} 

Dans la fonction gestionnaire :: changé (int index) Je

QComboBox* combo=(QComboBox*)table->cellWidget(_row,_col); 
combo->currentIndex() 

Pour récupérer une copie de la liste déroulante et obtenir la nouvelle sélection.
Mais je ne peux pas obtenir la ligne/col.
Aucun des signaux de la table cellXXXX n'est émis lorsqu'un élément incorporé est sélectionné ou modifié et que currentRow()/currentColumn() n'est pas défini.

Répondre

2

Je pense que vous voulez jeter un oeil à QSignalMapper. Cela ressemble à un cas d'utilisation typique pour cette classe, c'est-à-dire que vous avez une collection d'objets où vous vous connectez au même signal sur chacun mais souhaitez savoir quel objet a émis le signal.

6

expansion sur Troubadour de answer:

est ici une modification de la documentation QSignalMapper à votre situation:

QSignalMapper* signalMapper = new QSignalMapper(this); 

for (each row in table) { 
    QComboBox* combo = new QComboBox(); 
    table->setCellWidget(row,col,combo);       
    combo->setCurrentIndex(node.type()); 
    connect(combo, SIGNAL(currentIndexChanged(int)), signalMapper, SLOT(map())); 
    signalMapper->setMapping(combo, QString("%1-%2").arg(row).arg(col)); 
} 

connect(signalMapper, SIGNAL(mapped(const QString &)), 
     this, SLOT(changed(const QString &))); 

Dans la fonction de gestionnaire :: changé (position QString):

QStringList coordinates = position.split("-"); 
int row = coordinates[0].toInt(); 
int col = coordinates[1].toInt(); 
QComboBox* combo=(QComboBox*)table->cellWidget(row, col); 
combo->currentIndex() 

Notez qu'un QString est une manière assez maladroite de transmettre cette information. Un meilleur choix serait un nouveau QModelIndex que vous transmettez, et que la fonction modifiée supprimerait. L'inconvénient de cette solution est que vous perdez la valeur émise par currentIndexChanged, mais vous pouvez interroger le QComboBox pour son index de :: changed.

+1

connexion (signalMapper, SIGNAL (cartographiée (const QString &)), ce, SLOT (changé (const QString &))); –

+0

@ J.Chomel Excuses, je ne vois pas comment votre commentaire diffère de la dernière ligne de mon premier bloc de code Pouvez-vous élaborer? – Bill

-1

J'ai juste le même problème et voici comment j'ai résolu. J'utilise QPoint qui est un moyen plus simple d'enregistrer une valeur x-y qu'un QString. J'espère que cela t'aides.

classConstructor() { 
    //some cool stuffs here 
    tableVariationItemsSignalMapper = new QSignalMapper(this); 
} 

void ToolboxFrameClient::myRowAdder(QString price) { 
    QLineEdit *lePrice; 
    int index; 
    // 
    index = ui->table->rowCount(); 
    ui->table->insertRow(index); 
    // 
    lePrice = new QLineEdit(price); 
    connect(lePrice, SIGNAL(editingFinished()), tableVariationItemsSignalMapper, SLOT(map())); 
    tableVariationItemsSignalMapper->setMapping(lePrice, (QObject*)(new QPoint(0, index))); 
    // final connector to various functions able to catch map 
    connect(tableVariationItemsSignalMapper, SIGNAL(mapped(QObject*)), 
      this, SLOT(on_tableVariationCellChanged(QObject*))); 
} 

void ToolboxFrameClient::on_tableVariationCellChanged(QObject* coords) { 
    QPoint *cellPosition; 
    // 
    cellPosition = (QPoint*)coords; 
} 
+0

Je pense que vous avez une fuite de mémoire avec les objets QPoint, pourquoi utiliser nouveau? J'ai vraiment besoin des outils fournis par QPoint dans ce cas donc je ne profite pas beaucoup de l'utiliser – ymoreau

+0

@ymoreau Merci de m'avoir signalé cela il y a longtemps que je n'ai pas répondu à votre question. ay. –

7

Pas besoin du signal cartographe ... Lorsque le combobox est créé, vous pouvez simplement ajouter deux propriétés personnalisées à lui:

combo->setProperty("row", (int) nRow); 
combo->setProperty("col", (int) nCol); 

Dans la fonction de gestionnaire vous pouvez obtenir un pointeur sur la expéditeur du signal (votre combobox).

Maintenant, en demandant les propriétés que vous pouvez avoir votre ligne/col arrière:

int nRow = sender()->property("row").toInt(); 
int nCol = sender()->property("col").toInt();