Способы заполнения ComboBox
Используйте метод AddItem для загрузки элементов в поле со списком по одному:
1 |
WithUserForm1.ComboBox1 .AddItem»Элемент 1″ .AddItem»Элемент 2″ .AddItem»Элемент 3″ EndWith |
Используйте свойство List, чтобы скопировать одномерный массив значений в элемент управления ComboBox:
1 |
UserForm1.ComboBox1.List=Array(«Строка 1»,_ «Строка 2″,»Строка 3″,»Строка 4″,»Строка 5») |
Вместо функции Array можно использовать переменные одномерных и двухмерных массивов. При загрузке значений из двухмерного массива, требуется предварительно указать количество столбцов в комбинированном списке.
Используйте свойство RowSource, чтобы загрузить в ComboBox значения из диапазона ячеек рабочего листа:
1 | UserForm1.ComboBox1.RowSource=»Лист5!B1:B15″ |
При загрузке данных из диапазона, содержащего более одного столбца, требуется предварительно указать количество столбцов в комбинированном списке:
1 |
WithUserForm1.ComboBox1 ‘Указываем количество столбцов .ColumnCount=5 .RowSource=»‘Таблица с данными’!A1:E20″ EndWith |
В качестве имени листа используется имя ярлыка. Если имя листа содержит пробелы, оно заключается в одинарные кавычки.
Подробнее о заполнении элемента управления ComboBox вы можете ознакомиться в отдельной статье с наглядными примерами. И еще более подробно – в статье о заполнении ListBox, так как ListBox заполняется теми же способами, что и ComboBox.
Создание моделей данных для QComboBox +6
- 22.05.17 16:15
•
stanislav888
•
#329228
•
Хабрахабр
•
Tutorial
•
•
1900
C++, Qt
Всем привет! Хочу поделиться с вами двумя способами, как можно и нужно создавать модели данных для виджетов типа QComboBox в Qt. В конце статьи будет показано решение, для заполнения комбобокса из БД, одной строкой кода.
Способ №1. Полностью ручное создание модели
Все модели данных в Qt должны быть наследниками от QAbstractItemModel. Лично в моей практике комбобоксы всегда отображали перечисление из SQL базы данных. Это были пол, страна, национальность и некоторые другие списки, из которых пользователю нужно было выбрать один пункт. Поэтому, при создании модели, у меня всегда было две параллельных задачи:
- Как сформировать человекочитаемые названия пунктов пользователю?
- Как связать читаемые пункты с ключами, которые надо писать в БД?
Для реализации замысла. Первым делом надо посмотреть какие из методов QAbstractItemModel, вы обязаны определить у себя:
- QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex()) const
- QModelIndex QAbstractItemModel::parent(const QModelIndex & index) const
- int QAbstractItemModel::columnCount(const QModelIndex & parent = QModelIndex()) const
- int QAbstractItemModel::rowCount(const QModelIndex & parent = QModelIndex()) const
- QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const
columnCount()index()parent()QTreeViewQAbstractListModel
Все значения пунктов комбобокса, просто записываються в QList
Начинающим важно понимать. Не программист явно вызывает эту функцию в своём коде
А комбобокс обращается к данной функции когда ему надо! Ваша задача, что бы функция отдавала эти актуальные данные по запросу.
NationalityModel::data()QAbstractItemModel::data()
- const QModelIndex &index. Объект содержащий номер строки, колонки и ссылку на родительский QModelIndex. Т.е. QComboBox сообщает место(позицию) пункта, для которого запрашиваются данные. В нашем случае актуален только номер строки. Остальные параметры внутри &index только для совместимости с другими моделями, типа QTreeView и QTableView. Поэтому наша функция запрашивает пару, «читаемое» и «служебное» значения (DataPair) только для данной строки. Хранящиеся в списке возможных значений (m_content).
- int role. В этом параметре QComboBox сообщает, какого рода данные нужны(какая роль). В нашем случае «читаемое» значение это Qt::DisplayRole, а «служебное» Qt::UserRole.
За один вызов NationalityModel::data() возвращаются данные одной роли для одной, конкретной строки в списке.
Если обратится к enum ItemDataRole, где определены Qt::DisplayRole, Qt::UserRole. Станет понятно для чего ещё можно реализовать такую модель. Например, поменять шрифт некоторых пунктов (Qt::FontRole). Выровнять текст пункта меню, как то по особенному. Или задать текст всплывающей подсказки. Смотрите в упомянутый enum. Возможно вы найдёте там то что искали уже давно.
Варианты использования
Составной список
Если у каждой записи справочника есть несколько параметров, показывайте в списке самые важные. По ним должен работать поиск.
Основное значение — короткое, емкое и уникальное.
Выбор сделан
После выбора показывайте дополнительное значение в поле серым цветом. Если оно полностью не входит, показывайте при наведении хинт:
Фокус по заполненному полю
При получении фокуса тултип должен исчезнуть.
Поиск по вхождению
Если строка состоит из нескольких слов, то поиск совпадения может работать не только по началу строки, но и по началу каждого слова. Если слово начинается с кавычек, они не должны учитываться при поиске совпадения.
Чтобы понять, стоит ли использовать поиск по вхождению, задайте себе вопрос: точно ли пользователь знает начало строки? Если нет — используйте поиск по вхождению.
Подсвечивайте совпадения жирным начертанием Lab Grotesque K Bold.
Избранные варианты
Если это уместно, предлагайте пользователю наиболее вероятные варианты еще до начала ввода.
Фокус по пустому полю
Эти варианты показываются над основным списком,
отделяются чертой.
Если это комбобокс в режиме автокомплита сразу по фокусу показывайте список из 3-5 вариантов с заголовком. Заголовок нужен для того, чтобы было понятно, что это не полный список:
Указание значения не из справочника
Если справочник может быть неактуальным, дайте пользователю возможность указать свое значение
При этом значение пользователя не добавляется в справочник, а на странице выводится предупреждение, чтобы обратить внимание пользователя на возможную ошибку
Автоматическое добавление значения в справочник
Если пользователь сам наполняет справочник, то при вводе нового значения не показывайте текст «Нет совпадений». Добавляйте значение в список и при следующем заполнении предлагайте его наравне с остальными.
Фокус потерян без выбора из справочника
Добавление карточки в справочник
Если пользователь может сам наполнять справочник, и каждая запись это набор полей — добавьте в раскрывающийся список пункт для добавления новой записи в справочник. По клику на него открывается лайтбокс.
Фокус на пустом поле
Если добавление карточки частый сценарий — выбирайте пункт «Добавить» по умолчанию, чтобы
пользователь мог нажать Enter и быстро перейти к добавлению
новой карточки:
В открывающемся лайтбоксе добавления карточки поле «Название» предзаполняется уже введенным значением.
Потеря фокуса
Если в предыдущем состоянии поле теряет фокус, срабатывает валидация: поле красится в красный, показывается сообщение об ошибке.
Фокус и работа с клавиатурой
При клике по полю и при переходе табом поле выглядит одинаково: появляется синяя рамка, которая сохраняется до потери фокуса.
Работа с клавиатурой
Tab |
Переход к следующему контролу. |
Если открыт список вариантов из нескольких значений — переключение между строками. Переход между строками не цикличен — с последней строки фокус не переходит на первую, как и с первой на последнюю. Если список cкрыт, содержит только один вариант, сообщение об ошибке или о том, что нет совпадений — перенос текстового курсора в начало или конец строки (стандартное поведение для текстового поля). |
|
← → |
Перемещение текстового курсора в поле ввода. |
Esc |
Скрывает список, фокус не исчезает. Список появится вновь при вводе или удалении символа. |
Space |
Ввод пробела. |
Enter |
Выбор подсвеченного значения из списка и переход к следующему полю в форме. Если список пуст/не успел догрузиться, нажатие Enter ни к чему не приводит. |
Привязка данных в ListBox и ComboBox
Последнее обновление: 31.10.2015
Кроме прямого добавления элементов в коллекцию компонентов ListBox и ComboBox мы также можем использовать механизм привязки
данных.
Привязка данных в ListBox и ComboBox реализуется с помощью следующих свойств:
-
DataSource: источник данных — какой-нибудь массив или коллекция объектов
-
DisplayMember: свойство объекта, которое будет использоваться для отображения в ListBox / ComboBox
-
ValueMember: свойство объекта, которое будет использоваться в качестве его значения
Рассмотрим пример.
public partial class Form1 : Form { public Form1() { InitializeComponent(); List<Phone> phones = new List<Phone> { new Phone { Id=11, Name="Samsung Galaxy Ace 2", Year=2012}, new Phone { Id=12, Name="Samsung Galaxy S4", Year=2013}, new Phone { Id=13, Name="iPhone 6", Year=2014}, new Phone { Id=14, Name="Microsoft Lumia 435", Year=2015}, new Phone { Id=15, Name="Xiaomi Mi 5", Year=2015} }; listBox1.DataSource = phones; listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Id"; listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; } void listBox1_SelectedIndexChanged(object sender, EventArgs e) { // получаем id выделенного объекта int id = (int)listBox1.SelectedValue; // получаем весь выделенный объект Phone phone = (Phone)listBox1.SelectedItem; MessageBox.Show(id.ToString() + ". " + phone.Name); } } class Phone { public int Id { get; set; } public string Name { get; set; } public int Year { get; set; } }
Итак, на форме у нас есть список ListBox с именем listBox1. В коде имеется класс Phone с тремя свойствами, объекты которого мы хотим выводить в список.
В отличие от предыдущих тем эта задача сложнее, так как раньше мы выводили обычные строки, тут же у нас сложные объекты.
Для вывода используем механизм привязки. Сначала устанавливаем список телефонов в качестве источника данных:
listBox1.DataSource = phones;
Затем устанавливаем в качестве отображаемого свойства свойство Name класса Phone, а в качестве свойства значения — свойство Id:
listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Id";
Значение отображаемого свойства мы затем увидим в списке. Оно будет представлять каждый отдельный объект Phone.
С помощью же свойства значения, которым является свойство Id, мы можем упростить работу с источником данных. В данном случае оно не играет большой роли.
Но если бы мы использовали в качестве источника данных некоторый набор объектов из базы данных, то с помощью id нам было проще удалять, обновлять и взаимодействовать
с базой данных.
И теперь если мы выделим какой-то объект, то свойство SelectedItem элементы ListBox будет содержать объект Phone, у которого мы можем получить
значения свойств:
Phone phone = (Phone)listBox1.SelectedItem; string name = phone.Name;
А выделенное значение, то есть значение свойства Id выделенного телефона, будет находиться в свойстве SelectedValue.
И если мы запустим приложение, то увидим все отображаемые телефоны:
Все то же самое характерно и для элемента ComboBox. Пусть кроме ListBoxa на форме есть ComboBox:
public partial class Form1 : Form { public Form1() { InitializeComponent(); List<Phone> phones = new List<Phone> { new Phone { Id=11, Name="Samsung Galaxy Ace 2", Year=2012}, new Phone { Id=12, Name="Samsung Galaxy S4", Year=2013}, new Phone { Id=13, Name="iPhone 6", Year=2014}, new Phone { Id=14, Name="Microsoft Lumia 435", Year=2015}, new Phone { Id=15, Name="Xiaomi Mi 5", Year=2015} }; comboBox1.DataSource = phones; comboBox1.DisplayMember = "Name"; comboBox1.ValueMember = "Id"; comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged; listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Id"; } void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { Phone phone = (Phone)comboBox1.SelectedItem; listBox1.Items.Add(phone); } } class Phone { public int Id { get; set; } public string Name { get; set; } public int Year { get; set; } }
Здесь также для комбобокса устанавливается привязка, а также отображаемое свойство и свойство значения. Кроме того, здесь обрабатывается
событие выбора элемента в комбобоксе так, чтобы выбранный элемент попадал в ListBox.
В отличие от ListBoxa ComboBox имеет три свойства для обработки выделенного объекта:
-
: выбранный элемент
-
: значение свойства значения, в данном случае свойство Id
-
: значение свойства отображение, в данном случае свойство Name класса Phone
НазадВперед
Элемент ComboBox
Последнее обновление: 31.10.2015
Элемент ComboBox образует выпадающий список и совмещает функциональность компонентов ListBox и TextBox. Для хранения элементов списка в ComboBox также предназначено свойство
Items.
Подобным образом, как и с ListBox, мы можем в окне свойств на свойство Items и нам отобразится окно для добавления элементов ComboBox:
И как и с компонентом ListBox, здесь мы также можем программно управлять элементами.
Добавление элементов:
// добавляем один элемент comboBox1.Items.Add("Парагвай"); // добавляем набор элементов comboBox1.Items.AddRange(new string[] { "Уругвай", "Эквадор" }); // добавляем один элемент на определенную позицию comboBox1.Items.Insert(1, "Боливия");
При добавлении с помощью методов Add / AddRange все новые элементы помещаются в конец списка. Однако если мы зададим у ComboBox свойство
равным , тогда при добавлении будет автоматически производиться сортировка.
Удаление элементов:
// удаляем один элемент comboBox1.Items.Remove("Аргентина"); // удаляем элемент по индексу comboBox1.Items.RemoveAt(1); // удаляем все элементы comboBox1.Items.Clear();
Мы можем получить элемент по индексу и производить с ним разные действия. Например, изменить его:
comboBox1.Items = "Парагвай";
Настройка оформления ComboBox
С помощью ряда свойств можно настроить стиль оформления компонента. Так, свойство DropDownWidth задает ширину выпадающего списка.
С помощью свойства DropDownHeight можно установить высоту выпадающего списка.
Еще одно свойство MaxDropDownItems позволяет задать число видимых элементов списка — от 1 до 100. По умолчанию это число равно 8.
Другое свойство DropDownStyle задает стиль ComboBox. Оно может принимать три возможных значения:
-
Dropdown: используется по умолчанию. Мы можем открыть выпадающий список вариантов при вводе значения в текстовое поле или нажав на кнопку со стрелкой
в правой части элемента, и нам отобразится собственно выпадающий список, в котором можно выбрать возможный вариант -
DropdownList: чтобы открыть выпадающий список, надо нажать на кнопку со стрелкой в правой стороне элемента
-
Simple: ComboBox представляет простое текстовое поле, в котором для перехода между элементами мы можем использовать клавиши
клавиатуры вверх/вниз
Событие SelectedIndexChanged
Наиболее важным событием для ComboBox также является событие , позволяющее отследить выбор элемента в списке:
public partial class Form1 : Form { public Form1() { InitializeComponent(); comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged; } void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { string selectedState = comboBox1.SelectedItem.ToString(); MessageBox.Show(selectedState); } }
Здесь также свойство будет ссылаться на выбранный элемент.
НазадВперед
Элемент управления ComboBox
UserForm.ComboBox – это элемент управления пользовательской формы, предназначенный для передачи в код VBA информации, выбранной пользователем из раскрывающегося списка или введенной с клавиатуры.
ComboBox представляет из себя комбинацию двух элементов управления: текстового поля (TextBox) и списка (ListBox), поэтому его еще называют «комбинированным списком» или «полем со списком». Также ComboBox сочетает в себе свойства этих двух элементов управления.
Изначально комбинированный список прорисовывается на форме в виде текстового поля с кнопкой для отображения раскрывающегося списка. Далее по тексту будем использовать слово «поле» в значении текстового поля в составе элемента управления ComboBox, а словосочетание «раскрывающийся список» – в значении списка в составе элемента управления ComboBox.
Поле со списком используется в тех случаях, когда необходимо добавить в форму информацию, которая заранее известна, а ее отдельные позиции можно сгруппировать в список, а также для ручного ввода с клавиатуры или вставки из буфера обмена, если необходимое значение в списке отсутствует.
Элемент управления ComboBox незаменим при больших списках. При списках из нескольких позиций его можно заменить на ListBox, который отображает позиции для выбора сразу после загрузки формы, не требуя дополнительных действий от пользователя.
Getting the current state
In addition to the signals, has a few methods for getting the current state at any time. For example, you can use to get the index of the currently selected item in the combobox, or use to get the text. With the index you can also look up the text of a specific item using . Finally, you can use to get the total number of items in the combobox list.
In the example below, we use the activated signal we’ve already seen to hook up a number of methods which get information about the combobox and display this in the console. As you select any item in the combobox every method will run printing a message to the console.
python
Running this and selecting different items in the combobox will show the outputs.
python
QComboBox signals
The emits a number of signals on state changes. When the currently selected item changes, the widget emits and signals. The first receives the index of the selected entry while the second receives the text of that item. There is a further signal which is emitted for user-selections whether the index is changed or not: selecting the same entry again will still emit the signal. Highlighting an entry in the popup list will emit the signal.
The following example demonstrates these signals in action.
python
If you run the example the signals emitted as you interact with the will be shown in the console, giving output like that shown below. Note that when re-selecting the same entry, only the signal is emitted.
python
Create GUI Applications with Python & Qt5
The easy way to create desktop applications
The complete guide to building GUI applications with PySide2. From the basics of creating a desktop window to the key features you need to build real apps.
More info
Downloadable ebook (PDF, ePub) & Complete Source code
To support developers in ` countryRegion ` I give a
]]% discount
with the code ` couponCode ` — Enjoy!
For ` activeDiscount`.`description ` I’m giving a
` activeDiscount`.`discount `% discount
with the code ` couponCode ` — Enjoy!
Привязка поля со списком к ячейке
Чтобы привязать комбинированный список к ячейке на рабочем листе Excel, необходимо свойству ControlSource присвоить адрес ячейки. Это можно сделать непосредственно в окне Properties элемента управления ComboBox или в коде VBA:
Имя листа для составного адреса ячейки берется из названия ярлыка. Если имя листа содержит пробелы, оно заключается в одинарные кавычки. При указании адреса без имени листа, ComboBox привязывается к ячейке на активном листе.
В результате привязки образуется взаимосвязь между свойством Value комбинированного списка и значением ячейки. Все изменения в поле ComboBox дублируются в привязанной ячейке и наоборот, изменения в ячейке приводят к изменению текста в поле.
Чтобы протестировать результаты привязки ячейки к полю со списком ComboBox1, разместите на пользовательской форме UserForm1 еще какой-нибудь элемент управления и запустите следующий код VBA Excel:
1 |
SubTest() WithUserForm1.ComboBox1 ‘Заполняем список ComboBox1 данными .List=Array(«Красный»,»Оранжевый»,»Желтый»,_ «Зеленый»,»Голубой»,»Синий»,»Фиолетовый») ‘Привязываем ComboBox1 к ячейке «A1» .ControlSource=»A1″ ‘Открываем форму в немодальном окне EndWith UserForm1.Show EndSub |
В результате работы кода пользовательская форма откроется в немодальном окне со значением в поле, скопированном из ячейки «A1» активного листа. Немодальное окно формы позволит редактировать ячейку «A1», не закрывая форму.
Меняйте значение ячейки «A1», нажимайте клавишу «Tab» или «Enter», поле комбинированного списка примет значение ячейки. Меняйте значение поля ComboBox1 с помощью клавиатуры или выбирайте из раскрывающегося списка, нажимайте клавишу «Tab» или «Enter», ячейка «A1» примет значение поля со списком.
Дополнительный элемент управления на форме нужен для передачи ему фокуса нажатием клавиши «Tab» или «Enter», чтобы завершить ввод значения в поле ComboBox1. Иначе новое значение поля будет передано в ячейку «A1» только при закрытии формы.
Пример
В следующем примере показано, как использовать несколько элементов управления ComboBox для обеспечения критериев для запроса.
В следующем примере показано, как установить свойство RowSource для комбо-окна при загрузке формы. При отображлении формы элементы, хранимые в поле Departments в поле комбо tblDepartment, отображаются в поле комбо cboDept.
В следующем примере показано, как создать поле комбо, связанное с одним столбцом при отображке другого столбца. Настройка свойства ColumnCount до 2 указывает, что в поле cboDept будет отображаться первые два столбца источника данных, указанного свойством RowSource. Настройка свойства BoundColumn до 1 указывает, что значение, сохраненное в первом столбце, будет возвращено при проверке значения комбо-окна.
Свойство ColumnWidths указывает ширину двух столбцов. Задав ширину первого столбца до 0in. Первый столбец не отображается в поле комбо.
В следующем примере показано, как добавить элемент в связанное поле комбо.
Исходный код примера
Возможно вам будет интересно изучить этот код в работе. Для этих целей был создана реализация небольшой адресной книги.
Способ №2. Быстрое создание модели из перечисления в SQL БД
Конечно же самый правильный способ организации перечислений. Это хранить их в базе, в виде отдельных таблиц. И подгружать в комбобоксы в конструкторах форм. И было бы идеально иметь какое-то универсальное решение. Вместо написания отдельных классов моделей, для каждого перечисления.
Для реализации нам потребуется QSqlQueryModel. Это похожая модель. Она тоже наследник QAbstractItemModel, но используется для отображения результатов SQL запроса QSqlQuery в таблице QTableView. В данном случае, наша задача приспособить данный класс. Что бы он давал данные так же как в первом примере.
В данной реализации, всю работу делает QSqlQueryModel. Надо только немного переопределить логику QSqlQueryModel::data(). Для начала представьте, что в модель записывается SQL запрос «SELECT country.id, countryname || ‘ — ‘ || countrycode FROM country».
(«id»).Qt::DisplayRoleQSqlQueryModelQSqlQueryModelBaseComboModel::data().BaseComboModel::data()
- возвращает данные первого запрошенного столбца(«id») как Qt::UserRole первого столбца
- возвращает данные второго столбца(«countryname || ‘ — ‘ || countrycode») как Qt::DisplayRole первого столбца
- добавляет строку «(please select)» в самом начале. За счёт смещения номеров при запросе данных от QSqlQueryModel. Т.е. к результатам SQL запроса, модель сама добавляет ещё одну строку
Таким образом вы можете быстро и легко делать модели для QComboBox-а с помощью BaseComboModel. Например, у вас есть SQL таблица месяцев в году(«months»). Где два столбца, «id» и «monthname». Вам можно заполнить комбобокс выбора месяца следующим образом:ui->monthsCombo->setModel( new BaseComboModel( «monthname», «months», this ) );
Получить значение «id» выбранного месяца ui->monthsCombo->itemData( ui->monthsCombo->currentIndex(), Qt::UserRole );. Получть значение видимое пользователю ui->monthsCombo->currentText();. Этот код гораздо компактнее всех остальных случаев. Большинство разработчиков в данной ситуации пишут, отдельно запрос к базе (QSqlQuery). А потом, в цикле, добавляют полученные записи в комбобокс, через QComboBox::addItem(). Это конечно рабочее, но не самое красивое решение.
Populating a QComboBox
Items can be added or inserted to a , where adding appends the item to the end of the current list, while insert inserts them in a specific index in the existing list. There are convenience methods for adding multiple items to a combobox and also for adding icons to the list. The following example will demonstrate each of these using a series of comboboxes.
python
Run the example and compare the result with each series of add and insert steps.
Adding items to a QComboBox
You can replace the text at a specific index in the list by calling for example.
python
Finally, you can clear a — removing all items in it — by calling .
python
Editable comboboxes
You can set a to be editable allowing the user to type enter the values not currently in the list. Entered values can be added to the list, or just used as a value which is not inserted. To enable editing you can call on the widget, while control of how inserts operate is handled through the insert policy. This is set by calling passing one of the following flags:
Flag | Value | Behavior |
---|---|---|
No insert | ||
1 | Insert as first item | |
2 | Replace currently selected item | |
3 | Insert after last item | |
4 | Insert after current item | |
5 | Insert before current item | |
6 | Insert in alphabetical order |
For PyQt6 use the fully-qualified flag name, i.e.
For example, to insert new values alphabetically, you would use.
python
If the combobox is set to be editable, but is set as the insert policy, users will be able to enter their own custom values, but they will not be added to the list.
In the following example we have two widgets: one which is our editable box and the second which controls the insert policy of the first. Note that since the values of the flags (see above) are just numbers from 0 to 6, we can use the index to determine the flag.
python
If you run this example you’ll notice you can now type into the (top) editable combobox and submit them by pressing Enter. The signal will be emitted as you type into the field.
python
By default the insert policy is set to so entered values will not be added, just set as the value of the combobox. By selecting the insert policy in the second combobox you can change this behavior, having new entries added to the list.
Editing a QComboBox with insert policy
When you allow users to add values to the list, you may wish to constrain the maximum number of entries. This can be done using , e.g.