Выбор 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;
}