17

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()

取回组合框的副本并获取新的选择。
但我无法获得行/列。
None of the table cellXXXX signals is emitted when an embedded item is selected or changed and currentRow()/currentColumn() aren't set.

4

4 回答 4

13

不需要信号映射器...创建组合框后,您只需向其添加两个自定义属性:

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

在处理函数中,您可以获得指向信号发送者(您的组合框)的指针。

现在通过询问属性,您可以返回您的行/列:

int nRow = sender()->property("row").toInt();
int nCol = sender()->property("col").toInt();
于 2014-10-02T15:13:27.163 回答
9

扩展游吟诗人的回答

这是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 的索引。

于 2009-08-26T14:00:57.520 回答
2

我想你想看看 QSignalMapper。这听起来像是该类的典型用例,即您有一组对象,您在每个对象上连接到相同的信号,但想知道哪个对象发出了信号。

于 2009-08-26T05:34:58.323 回答
-1

刚遇到同样的问题,这就是我解决的方法。我使用 QPoint,它是一种比 QString 更简洁的保存 xy 值的方法。希望这可以帮助。

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;
}
于 2013-10-19T20:53:35.517 回答