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

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.


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


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?



8

Eu tive o mesmo problema

Eu resolvi por

value = self.comboBox.currentText()
print value

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

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

0

Eu tive o problema e

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

resolveu isso.


0

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

self.dlg.cbo_load_net.currentIndex()

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



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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.