¿Cómo puedo sacar el VALOR seleccionado de un QCombobox?

86

En Qt, puedo obtener el selected textde a QComboBoxusando el combobox->currentText()método. ¿Cómo puedo conseguirlo selected value?

Busqué ayuda pero no pude encontrar un método currentData()que esperaba encontrar. Solo pude encontrarcombobox->currentIndex()

¿Hay alguna forma más inteligente de hacerlo que no sea combobox->itemData(combobox->currentIndex())?

Actualización: esto ya no es necesario a partir de Qt 5. Se currentData()ha agregado un método http://doc.qt.io/qt-5/qcombobox.html#currentData-prop

sabbour
fuente

Respuestas:

85

Parece que debe hacerlo combobox->itemData(combobox->currentIndex())si desea obtener los datos actuales de QComboBox.

Si está utilizando su propia clase derivada de QComboBox, puede agregar una currentData()función.

Patrice Bernassola
fuente
2
Gracias. Acabo de usar este consejo en mi programa.
Brian Stinar
1
@Patrice Bernassola Sin embargo, la operación de cambio del tipo 'QVariant': ¡ combobox->itemData(combobox->currentIndex())es ilegal! Por qué ?
The Beast
Esto no funciona si no se selecciona nada, es decir currentIndex = -1. Devolverá los datos del último índice o generará un error si QComboBox está vacío.
Johnson
25

Este puede obtener el texto del índice actual:

QString cb = cbChoice ->currentText();
littlecodefarmer758
fuente
1
¿Cómo ayuda esto? currentTextes lo que el OP ya tiene conocimiento ...
Aconcagua
22

puede configurar los datos de QVariant para todos los elementos, luego puede obtener el valor cuando lo necesite.

hay un código de ejemplo para esta situación:

ui.comboBoxSheetSize->addItem("128 m", QVariant(128));
ui.comboBoxSheetSize->addItem("256 m", QVariant(256));
ui.comboBoxSheetSize->addItem("512 m", QVariant(512));
ui.comboBoxSheetSize->addItem("1024 m", QVariant(1024));

...

void Page::onComboSheetSizeChanged( int index )
{
 int value = ui.comboBoxSheetSize->itemData(index).toInt();
}

por cierto, creo que entendí mal tu pregunta. Creo que la forma en que obtienes datos es lo suficientemente inteligente.

ufukgun
fuente
8

Tuve el mismo problema

Yo he resuelto por

value = self.comboBox.currentText()
print value
jatinkumar patel
fuente
1
Ese es el texto de la etiqueta, no el valor.
mmitchell
3

Este es mi código OK en QT 4.7:

 //add combobox list 
    QString val;
   ui->startPage->clear();
    val = "http://www.work4blue.com";
    ui->startPage->addItem(tr("Navigation page"),QVariant::fromValue(val));
    val = "https://www.google.com";
    ui->startPage->addItem("www.google.com",QVariant::fromValue(val));
    val = "www.twitter.com";
    ui->startPage->addItem("www.twitter.com",QVariant::fromValue(val));
    val = "https://www.youtube.com";
    ui->startPage->addItem("www.youtube.com",QVariant::fromValue(val));

   // get current value
    qDebug() << "current value"<< 
       ui->startPage->itemData(ui->startPage->currentIndex()).toString();
bluedrum
fuente
1

Me sorprende que no haya una señal activada y tengo el mismo problema. Lo resolví haciendo una subclase de QComboBox. Creo que es mejor evitar tener que acceder directamente al objeto y llamar a sus funciones porque eso significa un acoplamiento más estrecho y va en contra de la filosofía de Qt. Así que aquí está la clase que hice y que funciona para mí.

class SmartComboBox : public QComboBox {

    Q_OBJECT

private slots:

    void triggerVariantActivated(int index);

public:

    SmartComboBox(QWidget *parent);

signals:

    void activated(const QVariant &);

};

Y la implementación

void SmartComboBox::triggerVariantActivated(int index)
{
    activated(itemData(index));
}

SmartComboBox::SmartComboBox(QWidget *parent)
:QComboBox(parent)
{
    connect(this, SIGNAL(activated(int)), this, SLOT(triggerVariantActivated(int)));
}
Pinkboi
fuente
0

Tuve el problema y

QString str = m_UI->myComboBox->currentText();

resuelto esto.

Kiriloff
fuente
0

si está desarrollando complementos de QGIS, simplemente

self.dlg.cbo_load_net.currentIndex()
Abhijit Gujar
fuente
0

hice esto

QDir path("/home/user/");
QStringList _dirs = path.entryList(QDir::Dirs);
std::cout << "_dirs_count = " << _dirs.count() << std::endl;
ui->cmbbox->addItem(Files);
ui->cmbbox->show();

Verá con esto que la QStringList llamada _dirs está estructurada como una matriz a cuyos miembros puede acceder a través de un índice hasta el valor devuelto por _dirs.count ()

E Purdy
fuente
-1

Sé que llego muy tarde, pero para aquellos que todavía tienen ese problema, se puede resolver fácilmente. Yo uso Qt 5.3 y funciona bien. No es necesario crear una función o todo eso.

int valueComboBox;
valueComboBox = comboBox->currentIndex();

y funciona ! Espero eso ayude !

Alioum Serouis
fuente
el índice no es lo mismo que el valor
Vladp
-4

Confirmo que la forma más fácil es hacer esto:

uiAnalyseAssets::AnalyseAssets(QWidget *parent)
: QWidget(parent)
{
ui.comboBox->addItem("text1");
ui.comboBox->addItem("text2");

...
}

void mainFunction::yourFunction( int index )
{
 int value = ui.comboBox->currentText();
}
Tarik
fuente
7
Espere un segundo, ¿no QComboBox::currentText()devuelve un QString? ¿Cómo se llega a un sensato int? ¿Y qué quieres hacer con tu parámetro int index?
Christian Severin