¿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

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.


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

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.



8

Tuve el mismo problema

Yo he resuelto por

value = self.comboBox.currentText()
print value

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

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

0

Tuve el problema y

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

resuelto esto.


0

si está desarrollando complementos de QGIS, simplemente

self.dlg.cbo_load_net.currentIndex()

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 ()



-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 !


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();
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.