Sélectionner QComboBox dans QTableWidget

une cellule dans chaque rangée d'un QTableWidget contient un combobox

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 handler ::changed (int index) j'ai

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

pour récupérer une copie du combobox 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() ne sont pas définis.

15
demandé sur demonplus 2009-08-26 06:49:04

4 réponses

pas besoin de l'émetteur de signal... Lorsque le combobox est créé, vous pouvez simplement y ajouter deux propriétés personnalisées:

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

dans la fonction handler vous pouvez obtenir un pointeur vers l'expéditeur du signal (votre combobox).

maintenant, en demandant les propriétés, Vous pouvez récupérer votre ligne / col:

int nRow = sender()->property("row").toInt();
int nCol = sender()->property("col").toInt();
9
répondu Richy 2014-10-02 15:13:27

en expansion sur Troubadour's réponse:

Voici une modification de l' QSignalMapper documentation adaptée à 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 handler:: changed (QString position):

 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 assez maladroit pour transmettre cette information. Un meilleur choix serait un nouveau QModelIndex que vous passez, et que la fonction modifiée supprimerait ensuite.

L'inconvénient de cette la solution est que vous perdez la valeur que currentIndexChanged émet, mais vous pouvez interroger le QComboBox pour son index à partir de ::changed.

6
répondu Bill 2017-05-23 12:09:35

je pense que vous voulez prendre un coup d'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 accrochez au même signal sur chacun, mais vous aimeriez savoir quel objet a émis le signal.

2
répondu Troubadour 2009-08-26 05:34:58

J'ai eu le même problème et c'est comme ça que j'ai résolu. J'utilise QPoint qui est un moyen plus propre de sauvegarder une valeur x-y qu'un QString. Espérons que cette aide.

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;
}
-1
répondu Daniele Brugnara 2013-10-19 20:53:35