Выбор QComboBox в QTableWidget

Одна ячейка в каждой строке 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)));
   ....
}

В функции обработчика :: изменен (int index) у меня есть

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

Вернуть копию выпадающего списка и получить новый выбор.

Но я могу'получить строку / кол.

Ни один из сигналов ячейки таблицы XXXX не излучается, когда внедренный элемент выбран или изменен и currentRow () / currentColumn () aren 'т набор.

Ответы на вопрос(4)

что вы хотите взглянуть на QSignalMapper. Это похоже на типичный вариант использования для этого класса, т. Е. У вас есть набор объектов, в которых вы подключаете к одному и тому же сигналу каждый, но хотели бы знать, какой объект испустил сигнал.

ответ:

Вот'с модификацией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 &)));

В функции-обработчике :: updated (позиция 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 его индекс из :: updated.

 Martin Beckett10 дек. 2009 г., 00:17
connect (signalMapper, SIGNAL (отображается (const QString &)), это, SLOT (изменено (const QString &)));
 Bill08 сент. 2017 г., 03:44
@ J.Chomel Извинения, я нене вижу, как ваш комментарий отличается от последней строки моего первого блока кода. Можете ли вы уточнить?

и вот как я решил. Я использую 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;
}
 Daniele Brugnara24 авг. 2017 г., 12:49
@ymoreau спасибо за указание на это. Прошло много времени с момента моего ответа, и я не могу ответить на ваш вопрос. Хорошего дня.
 ymoreau22 авг. 2017 г., 10:41
Я думаю, что у вас есть утечка памяти с объектами QPoint, зачем использовать новый? Также вы нев этом случае мне действительно не нужны инструменты, предоставляемые QPoint, поэтому я неЭто очень полезно.

вы можете просто добавить к нему два пользовательских свойства:

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

В функции обработчика вы можете получить указатель обратно на отправителя сигнала (ваш комбинированный список).

Теперь, запрашивая свойства, вы можете вернуть строку / столбец:

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

Ваш ответ на вопрос