QComboBox conectar

Necesito llamar a una función con currentIndex+1 cuando el currentIndex de un QComboBox cambios. Yo estoy luchando con la sintaxis de esta mañana:

//call function readTables(int) when currentIndex changes.

connect(ui->deviceBox, SIGNAL(currentIndexChanged()),
   SLOT( readTables( ui->deviceBox->currentIndex()+1) );

error: se esperaba ‘)’
RANURA( readTables(ui->deviceBox->currentIndex()+1) );

La adición de un cierre ) no funciona…!

  • Escribir es como connect(ui->deviceBox, SIGNAL(currentIndexChanged(int)), SLOT(readTables(int));. El readTables(int) ranura se llama con el actual índice como argumento.
  • Si vas a usar la versión de Qt 5+ y c++11, entonces usted puede escribir connect(ui->deviceBox, SIGNAL(currentIndexChanged(int)), [this]( int idx ) { readTables( idx + 1 ); } );
  • Les recomiendo leer el Qt Signals and Slots documentación: qt-project.org/doc/qt-4.8/signalsandslots.html
InformationsquelleAutor Jocala | 2015-01-21

2 Kommentare

  1. 8

    Primera. Si usted puede modificar la función de readTables a continuación, puedes escribir:

    connect(ui->deviceBox, SIGNAL(currentIndexChanged(int)), SLOT(readTables(int));

    y en readTables

    void MyClass::readTables( int idx ) {
        idx++;
        //do another stuff
    }

    Segundo: Si se puede usar Qt 5+ y c++11, acaba de escribir:

    connect(ui->deviceBox, SIGNAL(currentIndexChanged(int)),
        [this]( int idx ) { readTables( idx + 1 ); }
    );

    Tercer: Si usted no puede modificar readTables y no se puede utilizar c++11, escribir su propia ranura (decir readTables_increment) como este:

    void MyClass::readTables_increment( idx ) {
        readTables( idx + 1 );
    }

    y conecte la señal a la misma:

    connect(ui->deviceBox, SIGNAL(currentIndexChanged(int)),
        SLOT(readTables_increment(int))
    );
  2. 1

    QComboBox::currentIndexChanged espera un QString o un int como el único argumento. Tiene 2 errores aquí:

    • no se conecta a ninguna señal existente como se especifica currentIndexChanged() que no existe
    • que no están pasando un SLOT como la ranura de la argumentación, que requiere la ranura de la firma; por el contrario, usted está tratando de pasar de un argumento «sobre la marcha», que no es algo permitido.

    @borisbn sugerencia es bastante bueno, si bien con el uso de C++ lambdas.
    De lo contrario tendrás que declarar una nueva ranura con un int argumento:

    void ThisClass::slotCurrentIndexChanged(int currentIndex) {
        ui->deviceBox->readTables(ui->deviceBox->currentIndex() + 1);
    }

Kommentieren Sie den Artikel

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

Pruebas en línea