在QTableWidget的选择QComboBox(Selecting QComboBox in Q

2019-08-02 13:57发布

一个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指数)我有

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

要返回组合框的副本,并得到了新的选择。
但我不能让行/列。
当嵌入式项目被选择或改变及currentRow()/ currentColumn()没有被设置的射出表cellXXXX信号的无。

Answer 1:

无需信号变换器......当创建组合框,你可以简单地添加两个自定义属性吧:

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

在处理函数,你可以得到一个指针回信号(你的组合框)的发送者。

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

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


Answer 2:

扩展在游吟诗人的回答 :

这里的的修改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其指数从::改变。



Answer 3:

我想你想看看QSignalMapper。 这听起来像一个典型的用例该类即你有,你挂接到每个相同的信号对象的集合,但想知道哪些物体发出的信号。



Answer 4:

刚刚得到同样的问题,我这是怎么解决的。 我用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;
}


文章来源: Selecting QComboBox in QTableWidget