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