2010-12-02 17 views
36

¿Cuál sería la mejor manera de seleccionar un elemento en un cuadro combinado de QT fuera de una lista predefinida de valores únicos basados ​​en enum.QComboBox - establecer el elemento seleccionado en función de los datos del artículo

En el pasado me he acostumbrado al estilo de .NET de selección en el que el elemento se puede seleccionar mediante el establecimiento de la propiedad seleccionada para el valor del elemento que desee seleccionar:

cboExample.SelectedValue = 2; 

¿Hay alguna forma de hacer esto con QT basado en los datos del artículo, si los datos son una enumeración de C++?

Respuesta

76

Usted buscar el valor de los datos con FindData y luego usar SetCurrentIndex

QComboBox* combo = new QComboBox; 
combo->addItem("100",100.0); // 2nd parameter can be any Qt type 
combo->addItem ..... 

float value=100.0; 
int index = combo->findData(value); 
if (index != -1) { // -1 for not found 
    combo->setCurrentIndex(index); 
} 
+0

1, se debe mencionar cómo configurar los datos embargo. –

21

También puede echar un vistazo al método FINDTEXT (QString & texto) desde QComboBox; devuelve el índice del elemento que contiene el texto dado, (-1 si no se encuentra). La ventaja de utilizar este método es que no necesita establecer el segundo parámetro cuando agrega un elemento.

Aquí hay un pequeño ejemplo:

/* Create the comboBox */ 
QComboBox *_comboBox = new QComboBox; 

/* Create the ComboBox elements list (here we use QString) */ 
QList<QString> stringsList; 
stringsList.append("Text1"); 
stringsList.append("Text3"); 
stringsList.append("Text4"); 
stringsList.append("Text2"); 
stringsList.append("Text5"); 

/* Populate the comboBox */ 
_comboBox->addItems(stringsList); 

/* Create the label */ 
QLabel *label = new QLabel; 

/* Search for "Text2" text */ 
int index = _comboBox->findText("Text2"); 
if(index == -1) 
    label->setText("Text2 not found !"); 
else 
    label->setText(QString("Text2's index is ") 
        .append(QString::number(_comboBox->findText("Text2")))); 

/* setup layout */ 
QVBoxLayout *layout = new QVBoxLayout(this); 
layout->addWidget(_comboBox); 
layout->addWidget(label); 
+0

Usar findText() nunca es bueno. findData() debería ser la forma preferida. – hfrmobile

+2

Su declaración es contradictoria. Estoy de acuerdo en que findData debe ser la forma "preferida", pero no la única. Estoy escribiendo lógica para un sistema existente que a veces crea contenido de combobox "simple" con valores de datos nulos. Por lo general, findData es suficiente, pero a veces se necesita findText cuando no hay "datos" para encontrar. – TheGerm

1

Si conoce el texto en el cuadro combinado que desea seleccionar, sólo tiene que utilizar el método setCurrentText() para seleccionar ese elemento.

ui->comboBox->setCurrentText("choice 2"); 

Desde el Qt 5.7 documentación

El setCurrentText colocador() llama simplemente setEditText() si el cuadro combinado es editable . De lo contrario, si hay un texto coincidente en la lista, currentIndex se establece en el índice correspondiente.

Siempre que el cuadro combinado no sea editable, el texto especificado en la llamada a la función se seleccionará en el cuadro combinado.

Referencia: http://doc.qt.io/qt-5/qcombobox.html#currentText-prop

+0

ui-> comboBox-> setCurrentText ("opción") es el método válido y simple! – sonichy

+0

Tal vez vale la pena señalar que esto no está disponible en Qt 4.x, al menos no 4.8 – Hawkins

Cuestiones relacionadas