QComboBox может быть открытым, как для чтения и записи, так и только для чтения. Если он позволяет читать и записывать, пользователь может ввести новый вариант в дополнение к предлагаемым; в противном случае пользователь ограничен выбором варианта из раскрывающегося списка.
При создании виджета QComboBox можно указать, открыт ли он для чтения и записи или только для чтения, задавая логическое значение в конструкторе:
QComboBox *combo = new QComboBox(TRUE, parent, "widgetname");
Передача значения TRUE переводит QComboBox в режим "чтение/запись". Остальные параметры — обычный указатель на родительский виджет и имя создаваемого виджета.
Как все виджеты Qt, QComboBox обладает гибкостью и предлагает широкий набор функциональных возможностей.
Вы можете добавлять варианты по одному или набором, как тип QString или в стандартном формате char*.
Для вставки одного варианта вызовите функцию insertItem:
combo->insertItem(QString("An Item"), 1);
Приведенная функция принимает объект типа QString и номер позиции в списке. В данном случае 1 вставляет вариант в список первым.
Для добавления в конец списка задайте любое отрицательное целое число.
Гораздо чаще вы будете вставлять несколько элементов списка одновременно, для этого можно применить класс QStrList или, как показано далее, массив char*:
char* weather[] = {"Thunder", "Lightning", "Rain", 0};
combo->insertStrList(weather, 3);
И снова вы можете задать номер позиции вставляемых в список элементов.
Если в виджете QComboBox задан режим "чтение/запись", вводимые пользователем варианты могут автоматически вставляться в список. Это очень полезное, экономящее время свойство, избавляющее пользователя от повторного набора варианта, если он хочет уже введенный вариант использовать несколько раз.
Метод InsertionPolicy управляет позицией вводимого в список элемента. Вы можете выбрать одно из значений, приведенных в табл. 17.4.
Таблица 17.4
| Значение | Действие |
|---|---|
QComboBox::AtTop
|
Вставляет вводимый в список элемент первым |
QComboBox::AtBottom
|
Вставляет вводимый в список элемент последним |
QComboBox::AtCurrent
|
Заменяет предварительно выбранный вариант в списке |
QComboBox::BeforeCurrent
|
Вставляет вводимый элемент перед предварительно выбранным вариантом из списка |
QComboBox::AfterCurrent
|
Вставляет вводимый элемент после предварительно выбранного варианта из списка |
QComboBox::NoInsertion
|
Новый элемент не вставляется в список вариантов |
Для задания политики вызовите метод InsertionPolicy виджета QComboBox:
combo->setInsertionPolicy(QComboBox::AtTop);
Давайте бросим взгляд на конструкторы и методы выбора варианта виджета QComboBox:
#include <qcombobox.h>
QComboBox(QWidget *parent = 0, const char *name = 0);
QComboBox(bool readwrite, QWidget *parent = 0, const char *name = 0);
int count();
void insertStringList(const QStringList& list, int index = -1);
void insertStrList(const QStrList& list, int index = -1);
void insertStrList(const QStrList *list, int index = -1);
void insertStrList (const char **strings, int numStrings = -1, int index = -1);
void insertItem(const QString &t, int index = -1);
void removeItem(int index);
virtual void setCurrentItem(int index);
QString currentText();
virtual void setCurrentText(const QString &);
void setEditable(bool);
Функция count возвращает количество вариантов в списке. QStringList и QStrList — классы коллекций, которые можно применять для вставки вариантов. Удалить варианты можно с помощью метода removeItem, извлечь и задать текущий вариант можно, с помощью методов currentText и setCurrentText, а перейти в редактируемый режим — с помощью метода setEditable.
QComboBox порождает сигнал textChanged(QString&) при каждом новом выборе варианта, передавая вновь выбранный элемент как аргумент.
Выполните упражнение 17.6.
QComboBoxВ этом примере вы сделаете попытку применить виджет QComboBox и посмотрите, как ведут себя сигналы и слоты с параметрами. Вы создадите класс ComboBox, потомка QMainWindow. В нем будут два виджета QComboBox: один для чтения/записи, другой только для чтения. Вы установите связь с сигналом textChanged для того, чтобы получать текущее значение при каждом его изменении.
1. Введите следующий программный код и назовите файл ComboBox.h:
#include <qmainwindow.h>
#include <qcombobox.h>
class ComboBox : public QMainWindow {
Q_OBJECT
public:
ComboBox(QWidget* parent = 0, const char *name = 0);
private slots:
void Changed(const QString& s);
};