2009-08-26 14 views
14

Una celda en cada fila de una QTableWidget contiene un cuadro combinadoSelección QComboBox en 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))); 
    .... 
} 

En el controlador de función :: cambiado (int index) Tengo

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

Para conseguir de nuevo una copia del cuadro combinado y obtener la nueva selección.
Pero no puedo obtener la fila/col.
Ninguna de las señales de la tabla cellXXXX se emite cuando un elemento incrustado se selecciona o cambia y currentRow()/currentColumn() no están configurados.

Respuesta

2

Creo que quiere echarle un vistazo a QSignalMapper. Esto suena como un caso de uso típico para esa clase, es decir, tiene una colección de objetos donde se conecta a la misma señal en cada uno, pero desea saber qué objeto emitió la señal.

6

Ampliando Trovador de answer:

Aquí es una modificación de la documentación QSignalMapper para adaptarse a su situación:

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 &))); 

En la función de controlador :: cambiado (posición QString):

QStringList coordinates = position.split("-"); 
int row = coordinates[0].toInt(); 
int col = coordinates[1].toInt(); 
QComboBox* combo=(QComboBox*)table->cellWidget(row, col); 
combo->currentIndex() 

Tenga en cuenta que un QString es una forma bastante torpe de pasar esta información. Una mejor opción sería un nuevo QModelIndex que pase, y que la función modificada luego eliminaría.

La desventaja de esta solución es que se pierde el valor que emite currentIndexChanged, pero puede consultar QComboBox para su índice from :: changed.

+1

connect (signalMapper, SEÑAL (mapeado (QString y)), esto, SLOT (cambiado (QString &))); –

+0

@ J.Chomel Disculpas, no veo cómo difiere tu comentario de la última línea de mi primer bloque de código. ¿Puedes elaborar? – Bill

-1

Acabo de tener el mismo problema y así es como lo resolví. Uso QPoint que es una forma más limpia de guardar un valor x-y que un QString. Espero que esto ayude.

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; 
} 
+0

Creo que tienes una pérdida de memoria con los objetos QPoint, ¿por qué usar una nueva? También no lo haces realmente necesito las herramientas que proporciona QPoint en este caso, así que no me beneficia mucho de su uso. – ymoreau

+0

@ymoreau gracias por señalar esto. Ha pasado mucho tiempo desde mi respuesta y no puedo responder a su pregunta. Tenga una buena sí. –

7

No hay necesidad de la señal asignador ... Cuando se crea el cuadro combinado sólo tiene que añadir dos propiedades personalizadas a ella:

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

En la función de controlador se puede obtener un puntero de nuevo al emisor de la señal (su cuadro combinado).

Ahora pidiendo las propiedades que puede tener su fila/columna posterior:

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