Como posso obter o VALOR selecionado de um QCombobox?

86

No Qt, posso obter o selected textde a QComboBoxusando o combobox->currentText()método. Como posso obter o selected value?

Procurei ajuda, mas não consegui encontrar um método currentData()que esperava encontrar. Eu só pude encontrarcombobox->currentIndex()

Existe uma maneira mais inteligente de fazer isso diferente combobox->itemData(combobox->currentIndex())?

Atualização: isso não é mais necessário a partir do Qt 5. Um currentData()método foi adicionado http://doc.qt.io/qt-5/qcombobox.html#currentData-prop

Sabbour
fonte

Respostas:

85

Parece que você precisa fazer isso combobox->itemData(combobox->currentIndex())se quiser obter os dados atuais do QComboBox.

Se estiver usando sua própria classe derivada de QComboBox, você pode adicionar uma currentData()função.

Patrice Bernassola
fonte
2
Obrigado. Acabei de usar essa dica no meu programa.
Brian Stinar,
1
@Patrice Bernassola No entanto, a operação de troca do tipo 'QVariant': combobox->itemData(combobox->currentIndex())é ilegal !!! Por quê ?
A Besta
Isso não funciona se nada for selecionado, ou seja currentIndex = -1. Ele retornará os dados do último índice ou gerará um erro se o QComboBox estiver vazio.
johnson
25

Este pode obter o texto do índice atual:

QString cb = cbChoice ->currentText();
littlecodefarmer758
fonte
1
Como isso ajuda? currentTexté o que o OP já sabe ...
Aconcágua
22

você pode definir dados QVariant para todos os itens e, em seguida, obter o valor quando precisar.

há um código de exemplo para esta situação:

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 propósito, acho que não entendi sua pergunta. Eu acho que a maneira como você obtém dados é inteligente o suficiente?

ufukgun
fonte
11

A função membro QComboBox :: currentData foi adicionada desde que esta pergunta foi feita, veja este commit

joaerl
fonte
Para obter a documentação, consulte: doc.qt.io/qt-5/qcombobox.html#currentData-prop . A propriedade está disponível desde o Qt 5.2.
m4tx
8

Eu tive o mesmo problema

Eu resolvi por

value = self.comboBox.currentText()
print value
jatinkumar patel
fonte
1
Esse é o texto do rótulo, não o valor.
mmitchell
3

Este é o meu código OK no 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
fonte
1

Estou surpreso que não haja um sinal ativado e tenha o mesmo problema. Eu resolvi isso criando uma subclasse de QComboBox. Eu acho que é melhor evitar ter que acessar diretamente o objeto e chamar suas funções porque isso significa um acoplamento mais forte e vai contra a filosofia do Qt. Então aqui está a aula que fiz que funciona para mim.

class SmartComboBox : public QComboBox {

    Q_OBJECT

private slots:

    void triggerVariantActivated(int index);

public:

    SmartComboBox(QWidget *parent);

signals:

    void activated(const QVariant &);

};

E a implementação

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

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

Eu tive o problema e

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

resolveu isso.

Kiriloff
fonte
0

se você está desenvolvendo plugins QGIS, então simplesmente

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

eu fiz isso

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

Você verá com isso que o QStringList chamado _dirs é estruturado como uma matriz cujos membros você pode acessar por meio de um índice até o valor retornado por _dirs.count ()

E Purdy
fonte
-1

Sei que estou muito atrasado, mas para quem ainda tem esse problema, pode ser resolvido facilmente. Eu uso o Qt 5.3 e funciona bem. Não há necessidade de criar uma função ou tudo isso.

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

e funciona! Espero que ajude !

Alioum Serouis
fonte
índice não é igual ao valor
Vladp
-4

Eu confirmo que a maneira mais fácil é fazer isso:

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
fonte
7
Espere um segundo - não QComboBox::currentText()retorna um QString? Como você chega a um sensato int? E o que você quer fazer com o seu parâmetro int index?
Christian Severin