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)));
....
}
在处理程序函数:: changed(int index)中我有
QComboBox* combo=(QComboBox*)table->cellWidget(_row,_col);
combo->currentIndex()
取回组合框的副本并获得新的选择 但我无法获得行/列 选择或更改嵌入项目并且未设置currentRow()/ currentColumn()时,不会发出表格cellXXXX信号。
答案 0 :(得分:10)
无需信号映射器......创建组合框后,您只需向其添加两个自定义属性:
combo->setProperty("row", (int) nRow);
combo->setProperty("col", (int) nCol);
在处理函数中,您可以获得指向信号发送者(组合框)的指针。
现在通过询问属性,您可以返回行/列:
int nRow = sender()->property("row").toInt();
int nCol = sender()->property("col").toInt();
答案 1 :(得分:7)
扩展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 position):
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发出的值,但您可以从:: changed中查询QComboBox的索引。
答案 2 :(得分:2)
我想你想看看QSignalMapper。这听起来像是该类的典型用例,即你有一组对象,你可以在每个对象上连接相同的信号,但想知道哪个对象发出信号。
答案 3 :(得分:-1)
遇到同样的问题,这就是我解决的问题。我使用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;
}