Выбор QComboBox в QTableWidget
Одна ячейка в каждой строке QTableWidget содержит 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)));
....
}
В функции обработчика:: changed (int index) у меня есть
QComboBox* combo=(QComboBox*)table->cellWidget(_row,_col);
combo->currentIndex()
Чтобы вернуть копию списка со списком и получить новый выбор.
Но я не могу получить строку /col.
Ни один из сигналов cellXXXX в таблице не выделяется, когда выбранный или измененный элемент включен, а currentRow()/currentColumn() не установлены.
Ответы
Ответ 1
Нет необходимости в компоновщике сигналов... Когда вы создаете комбобокс, вы можете просто добавить к нему два настраиваемых свойства:
combo->setProperty("row", (int) nRow);
combo->setProperty("col", (int) nCol);
В функции обработчика вы можете вернуть указатель к отправителю сигнала (ваш combobox).
Теперь, запросив свойства, вы можете вернуть строку/столбец:
int nRow = sender()->property("row").toInt();
int nCol = sender()->property("col").toInt();
Ответ 2
Расширение на Troubadour answer:
Здесь приведена модификация документации QSignalMapper в соответствии с вашей ситуацией:
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 &)));
В функции обработчика:: changed (позиция QString):
QStringList coordinates = position.split("-");
int row = coordinates[0].toInt();
int col = coordinates[1].toInt();
QComboBox* combo=(QComboBox*)table->cellWidget(row, col);
combo->currentIndex()
Обратите внимание, что QString - довольно неуклюжий способ передать эту информацию. Лучшим выбором будет новый QModelIndex, который вы передадите, и который затем изменила функция.
Недостатком этого решения является то, что вы теряете значение, которое испускает currentIndexChanged, но вы можете запросить QComboBox для своего индекса из:: changed.
Ответ 3
Я думаю, вы хотите взглянуть на QSignalMapper. Это звучит как типичный вариант использования для этого класса, т.е. У вас есть коллекция объектов, где вы подключаетесь к одному и тому же сигналу на каждом, но хотели бы знать, какой объект излучал сигнал.
Ответ 4
У меня была такая же проблема, и я решил это. Я использую QPoint, что является более чистым способом сохранения значения x-y, чем QString. Надеюсь, это поможет.
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;
}