6.2 KiB
DarkCombo
Обзор компонента
Minecraft_launcher — десктопный лаунчер Minecraft на Qt Quick. Всё окно оформлено вручную в
тёмной теме, а стиль Qt Quick Controls принудительно выставлен в Basic (main.cpp), потому что
нативные стили игнорируют пользовательские contentItem и background. Из-за этого каждый
стандартный элемент управления, попадающий в интерфейс, приходится переопределять самому.
DarkCombo — как раз такое переопределение: выпадающий список в общем тёмном стиле окна.
Компонент не добавляет логики, он целиком про внешний вид — фон, рамку, стрелку, делегат строки и
всплывающую панель. К нему обращаются всюду, где нужен выпадающий список внутри диалогов: выбор
версии модлоадера, выбор Java, поля в настройках.
Место в проекте и зависимости
Импортирует QtQuick и QtQuick.Controls 2.15; собственных C++-типов не использует.
Объявлен в QML_FILES модуля Minecraft_launcher (см. CMakeLists.txt), поэтому доступен по
имени DarkCombo в любом файле того же модуля без явного импорта.
Используется в LoaderRow — список версий модлоадера — и дважды в Main: в выпадающих списках профиля и сборки на главном окне.
Компонент ссылается на ресурсы images/Profile_Box/Asset_23.svg и
images/Profile_Box/Asset_24.svg — они перечислены в RESOURCES того же QML-модуля, отдельного
подключения не требуют.
Иерархия и роль
Корневой тип — ComboBox из Qt Quick Controls. Всё поведение (модель, currentIndex,
activated, displayText, клавиатурная навигация) наследуется без изменений; DarkCombo
переопределяет только четыре визуальных слота базового типа:
| Слот | Что даёт DarkCombo |
|---|---|
indicator |
стрелка из SVG-ресурса вместо двойного шеврона Basic-стиля; при открытом списке (down) картинка меняется |
contentItem |
текст текущего значения белым, с обрезкой справа многоточием и отступом под стрелку |
background |
тёмный прямоугольник со скруглением 6 px; рамка подсвечивается акцентным цветом при фокусе |
delegate |
строка списка: белый текст, подсветка фона у элемента под курсором |
popup |
всплывающая панель шириной с сам комбобокс, высотой не более 220 px, с вертикальным индикатором прокрутки |
Свойства
Собственных свойств компонент не объявляет — доступен весь набор свойств ComboBox
(model, currentIndex, currentText, displayText, editable и прочие).
Внутри delegate объявлены два обязательных свойства делегата, они относятся к строке списка,
а не к самому комбобоксу:
| Свойство | Тип | По умолчанию | Обязательное | Описание |
|---|---|---|---|---|
modelData |
var |
— | Да | Значение строки модели; выводится текстом в строке списка. Модель ожидается плоской — списком строк, а не объектов. |
index |
int |
— | Да | Позиция строки; сравнивается с highlightedIndex комбобокса, чтобы подсветить строку под курсором. |
Сигналы
Собственных сигналов нет. Наследуются сигналы ComboBox, из которых на практике используется
activated(int index) — выбор строки пользователем (в отличие от currentIndexChanged, он не
срабатывает при программной смене значения).
Методы
Собственных функций нет.
Взаимодействие с другими компонентами
Компонент самодостаточен и ничего не знает ни о бэкенде, ни о родителе: модель приходит извне
через model, результат выбора родитель получает через унаследованный activated. Так,
LoaderRow передаёт в model список подписей версий модлоадера и в обработчике
activated переводит индекс обратно в номер версии.
Поскольку модель ожидается списком строк, вызывающий код обычно сам приводит массив объектов к массиву подписей перед присваиванием.
Пример использования
DarkCombo {
width: 200
height: 32
model: ["1.21.1", "1.20.6", "1.20.4"]
onActivated: (index) => console.log("выбрано:", model[index])
}
При создании этого документа использовался ИИ.