La selección de QComboBox en QTableWidget

Una celda de cada fila de una QTableWidget contiene un combobox

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 la función de controlador ::cambia(int index) he

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

Para obtener una copia de la combobox y obtener la nueva selección.
Pero no puedo obtener la fila/col.
Ninguno de la mesa cellXXXX señales se emite cuando un elemento incrustado es seleccionado o cambiado y currentRow()/currentColumn() no se establecen.

OriginalEl autor | 2009-08-26

4 Kommentare

  1. 10

    Sin necesidad de que la señal de asignador de… Cuando el combobox se crea usted puede simplemente añadir dos propiedades personalizadas:

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

    En la función de controlador de obtener un puntero de vuelta al remitente de la señal (su combobox).

    Ahora al preguntar por las propiedades que puede tener su fila/col espalda:

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

    OriginalEl autor Richy

  2. 7

    Expansión en el Trovador de la respuesta:

    Aquí es una modificación de la QSignalMapper documentación 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 ::se ha cambiado(QString posición):

     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 bastante torpe manera de pasar esta información. Una mejor opción sería un nuevo QModelIndex que pase, y que el cambio de función, a continuación, eliminar.

    La desventaja de esta solución es que se pierde el valor que currentIndexChanged emite, pero usted puede consultar la QComboBox por su índice de ::se ha cambiado.

    conectar(signalMapper, la SEÑAL(asignada(const QString &)),esto, RANURA(cambiado(const QString &)));
    Disculpas, no veo cómo tu comentario difiere de la última línea de mi primer bloque de código. Usted puede elaborar?

    OriginalEl autor Bill

  3. 2

    Creo que usted desee echar un vistazo a QSignalMapper. Esto suena como un caso de uso típico de esa clase, es decir, tiene una colección de objetos, donde te conectas a la misma señal en cada uno, pero quisiera saber que objeto que emite la señal.

    OriginalEl autor Troubadour

  4. -1

    Sólo tengo el mismo problema y esto es lo que he resuelto. Yo uso QPoint que es un limpiador para guardar un x-y valor de 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;
    }
    Creo que usted tiene una pérdida de memoria con la QPoint objetos, ¿por qué usar de nuevo ? También usted realmente no necesita las herramientas QPoint proporcionar en este caso, así que no es de mucho beneficio.
    gracias por señalarlo. Mucho tiempo ha pasado desde que mi respuesta y no puedo responder a su pregunta. Que tengan un buen día.

    OriginalEl autor Daniele Brugnara

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea