Come posso ottenere il VALORE selezionato da una QCombobox?


87

In Qt, posso ottenere il selected textdi a QComboBoxutilizzando il combobox->currentText()metodo. Come posso ottenere il selected value?

Ho cercato aiuto ma non sono riuscito a trovare un metodo currentData()che mi aspettavo di trovare. Potevo solo trovarecombobox->currentIndex()

C'è un modo più intelligente per farlo diverso da combobox->itemData(combobox->currentIndex())?

Aggiornamento: non è più necessario a partire da Qt 5. È currentData()stato aggiunto un metodo http://doc.qt.io/qt-5/qcombobox.html#currentData-prop

Risposte:


87

Sembra che sia necessario farlo combobox->itemData(combobox->currentIndex())se si desidera ottenere i dati correnti del QComboBox.

Se stai usando la tua classe derivata da QComboBox, puoi aggiungere una currentData()funzione.


2
Grazie. Ho appena usato questo suggerimento nel mio programma.
Brian Stinar

1
@Patrice Bernassola Tuttavia l'operazione di commutazione di tipo "QVariant": combobox->itemData(combobox->currentIndex())è illegale !!! Perché ?
The Beast

Questo non funziona se non è selezionato nulla, ad es currentIndex = -1. Restituirà i dati dall'ultimo indice o genererà un errore se il QComboBox è vuoto.
johnson

24

Questo può ottenere il testo dell'indice corrente:

QString cb = cbChoice ->currentText();

3
In che modo questo aiuta? currentTextè ciò di cui l'OP è già a conoscenza ...
Aconcagua

23

puoi impostare i dati QVariant per tutti gli elementi, quindi puoi ottenere il valore quando ne hai bisogno.

c'è un codice di esempio per questa situazione:

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

a proposito, penso di aver frainteso la tua domanda. penso che il modo in cui ottieni i dati sia abbastanza intelligente?



7

Ho avuto lo stesso problema

Ho risolto da

value = self.comboBox.currentText()
print value

2
Questo è il testo dell'etichetta, non il valore.
mmitchell

3

Questo è il mio codice OK in 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

Sono stupito che non ci sia un segnale attivato e ho lo stesso problema. L'ho risolto creando una sottoclasse di QComboBox. Penso che sia meglio evitare di dover accedere direttamente all'oggetto e chiamare le sue funzioni perché ciò significa accoppiamento più stretto e va contro la filosofia di Qt. Quindi ecco la classe che ho fatto che funziona per me.

class SmartComboBox : public QComboBox {

    Q_OBJECT

private slots:

    void triggerVariantActivated(int index);

public:

    SmartComboBox(QWidget *parent);

signals:

    void activated(const QVariant &);

};

E l'implementazione

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

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


0

l'ho fatto

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

Vedrai con questo che la QStringList denominata _dirs è strutturata come un array ai cui membri puoi accedere tramite un indice fino al valore restituito da _dirs.count ()


-1

Ho avuto il problema e

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

risolto questo.


Ancora una volta, come altri hanno scritto sopra, questo è testo selezionato , NON VALORE selezionato . Una cosa diversa.
Oak_3260548

-1

se stai sviluppando plugin QGIS, allora semplicemente

self.dlg.cbo_load_net.currentIndex()

No, anche questo non è selezionatoVALUE . Selezionato TEXT, selezionato VALUEe selezionato INDEXsono cose completamente diverse. Solo in una coincidenza può indexessere uguale a value. Se le persone vogliono usare il combo, devono imparare e capire la differenza. E per quanto ne so, in Qt il VALORE è un po 'esteso quando si utilizzano modelli di dati.
Oak_3260548

-2

So di essere molto in ritardo, ma per coloro che hanno ancora quel problema, può essere risolto facilmente. Uso Qt 5.3 e funziona bene. Non c'è bisogno di creare una funzione o tutto il resto.

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

e funziona! Spero che sia d'aiuto !


index non è lo stesso del valore
Vladp

-5

Confermo che il modo più semplice è farlo:

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
Aspetta un secondo - non QComboBox::currentText()restituisce un QString? Come si arriva a un ragionevole int? E cosa vuoi fare con il tuo parametro int index?
Christian Severin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.