Выбор QComboBox в QTableWidget - PullRequest
15 голосов
/ 26 августа 2009

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

Ответы [ 4 ]

10 голосов
/ 02 октября 2014

Нет необходимости в отображении сигнала ... Когда создается комбинированный список, вы можете просто добавить к нему два пользовательских свойства:

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

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

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

int nRow = sender()->property("row").toInt();
int nCol = sender()->property("col").toInt();
7 голосов
/ 26 августа 2009

Расширение на ответ Трубадура :

Вот модификация документации 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 &)));

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

2 голосов
/ 26 августа 2009

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

0 голосов
/ 20 октября 2013

Только что получил ту же проблему, и вот как я решил. Я использую 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;
}
...