web-dev-qa-db-fra.com

Comment puis-je extraire la valeur sélectionnée d'un QCombobox?

Dans Qt, je peux obtenir le selected text d'une QComboBox en utilisant la méthode combobox->currentText() . Comment puis-je obtenir le selected value?

J'ai cherché de l'aide mais je n'ai pas trouvé de méthode currentData() que je m'attendais à trouver. Je n'ai trouvé que combobox->currentIndex()

Existe-t-il un moyen plus intelligent de procéder autrement que combobox->itemData(combobox->currentIndex())?

Mise à jour: Ceci n'est plus nécessaire à partir de Qt 5. Une méthode currentData() a été ajoutée http://doc.qt.io/qt-5/qcombobox.html#currentData-prop

76
sabbour

Il semble que vous ayez besoin de combobox->itemData(combobox->currentIndex()) si vous voulez obtenir les données actuelles de QComboBox.

Si vous utilisez votre propre classe dérivée de QComboBox, vous pouvez ajouter une fonction currentData().

73
Patrice Bernassola

Celui-ci peut obtenir le texte de l'index actuel:

QString cb = cbChoice ->currentText();
22
littlecodefarmer758

vous pouvez définir les données QVariant pour tous les éléments, puis vous pouvez obtenir la valeur quand vous en avez besoin.

il existe un exemple de code pour cette situation:

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

en passant, je pense que j'ai mal compris votre question. Je pense que la façon dont vous obtenez les données est assez intelligente?

19
ufukgun

La fonction membre QComboBox :: currentData a été ajoutée depuis la réponse à cette question, voir ceci commit

11
joaerl

J'ai eu le même problème 

J'ai résolu par 

value = self.comboBox.currentText()
print value
6
jatin

Ceci est mon code OK dans 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();
2
bluedrum

Je suis étonné qu'il n'y ait pas de signal activé et avoir le même problème. Je l'ai résolu en créant une sous-classe de QComboBox. Je pense qu'il est préférable d'éviter d'avoir à accéder directement à l'objet et à appeler ses fonctions car cela signifie un couplage plus étroit et va à l'encontre de la philosophie de Qt. Alors voici le cours que j'ai fait qui fonctionne pour moi.

class SmartComboBox : public QComboBox {

    Q_OBJECT

private slots:

    void triggerVariantActivated(int index);

public:

    SmartComboBox(QWidget *parent);

signals:

    void activated(const QVariant &);

};

Et la mise en place

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

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

J'ai fait ça

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

Vous verrez ainsi que le QStringList nommé _dirs est structuré comme un tableau dont vous pouvez accéder aux membres via un index jusqu’à la valeur renvoyée par _dirs.count ()

0
E Purdy

si vous développez des plugins QGIS, alors simplement 

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

J'avais le problème et 

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

résolu ceci. 

0
octoback