- 1. Разработка Custom Dialog
- 2. main.qml
- 3. Итог
- 4. Видеоурок
После того, как Мы сделали кастомизированные кнопки в предыдущем уроке , настало время сделать Custom Dialog , который будет выглядеть более нативно для Android устройства, а может даже и смахивать по дизайну на IOS устройство. Во всяком случае Вы сможете более основательно подойди к реализации гайдов этих устройств.
Для создания диалога будет использоваться объект Dialog из библиотеки QtQuick.Dialog . А нюанс при работе с Custom Dialog под Android заключается в том, что Стандартные Кнопки, которые адекватно выглядят при разработке под Desktop, под Android выглядят вырвиглазно, да и ещё их проблематично кастомизировать для начинающего разработчика. Проще реализовать собственные кнопки с собственной стилизацией.
Разработка Custom Dialog
Разработку кастомизированного диалога продолжим на основе проекта из предыдущего урока. Там у нас были созданы две Custom Button , которые мы немного подправим по цветовой гамме, чтобы они лаконично выглядели по отношению к Диалогу. А также, используя прием по их стилизации, стилизуем кнопки диалогового окна, в которому будут присутствовать две кнопки: "OK" и "Cancel". Эти кнопки будут закрывать диалог.
Кнопки диалогового окна нужно будет прибить к нижней части диалога, а остальную часть отдадим под сообщение "Hello, World!!!", а также разделим кнопки серой линией друг с другом, и такой же линией отделим эти кнопки от сообщения. Будет похоже немного на IOS диалог. В качестве линии будет выступать прямоугольник Rectangle, такой же приём применяется и при разработке под Android на Java , только вместо QML используется XML вёрстка.
Для того, чтобы сделать нормальное кастомизированное содержимое диалогового окна, необходимо задать его параметру contentItem тот объект, который заменит содержимое. Наиболее удобным объектом является Rectangle , а уже в нём будем размещать все остальные объекты. Естественно никаких стандартных кнопок там уже и в помине не будет, так что можете о них забыть, но это не большая потеря на самом деле.
main.qml
Вся работа будет производиться только в файле main.qml, поэтому привожу только его. Остальную информацию можете посмотреть в предыдущей статьей .
- import QtQuick 2.5
- import QtQuick.Controls 1.4
- import QtQuick.Controls.Styles 1.4
- import QtQuick.Dialogs 1.2
- import QtQuick.Layouts 1.1
- ApplicationWindow {
- visible: true
- width: 640
- height: 480
- title: qsTr("Hello World") // Ну как же без Приветствия Миру
- color: "white"
- MainForm {
- // Растягиваем объект главного окна по всему родительскому элементу
- anchors.fill: parent
- // Стилизуем первую кнопку
- button1.style: ButtonStyle {
- // Стилизуем внешний вид кнопки
- background: Rectangle {
- /* Если кнопка нажата, то она будет красного цвета
- * с черным ободком со скруглёнными краями,
- * в противном случае она будет черного цвета с красным ободком
- */
- color: control.pressed ? "#d7d7d7" : "#f7f7f7"
- border.color: "#d7d7d7"
- border.width: 2
- radius: 5
- }
- // Стилизуем цвет текста кнопки
- label: Text {
- /* Если кнопка нажата, то цвет будет черным
- * в противном случае красным
- */
- text: qsTr("Press Me 1")
- color: "black"
- }
- }
- // Стилизуем вторую кнопку
- button2.style: ButtonStyle {
- // Стилизуем внешний вид кнопки
- background: Rectangle {
- /* аналогично, что и для первой кнопки,
- * но в противоположном порядке
- */
- color: control.pressed ? "#d7d7d7" : "#f7f7f7"
- border.color: "#d7d7d7"
- border.width: 2
- radius: 5
- }
- // Стилизуем цвет кнопки
- label: Text {
- /* аналогично, что и для первой кнопки,
- * но в противоположном порядке
- */
- text: qsTr("Press Me 2")
- color: "black"
- }
- }
- // Запускаем диалог по нажатию любой из кнопок в главном окне
- button1.onClicked: dialogAndroid.open();
- button2.onClicked: dialogAndroid.open();
- // Создаём объект диалогового окна
- Dialog {
- id: dialogAndroid
- /* Когда деплоите под Android-устройства,
- * обязательно закоментируйте эти две строки,
- * иначе словите глюки в работе устройства
- */
- width: 600 // Задаём ширину диалога, работает на десктопе, но на Android не сработает
- height: 500 // Задаём высоту диалога, работает на декстопе, но на Android не сработает
- // Создаём содержимое диалогового окна
- contentItem: Rectangle {
- width: 600 // Устанавливаем ширину, необходимо для Android-устройства
- height: 500 // Устанавливаем высоту, необходимо для Android-устройства
- color: "#f7f7f7" // Задаём цвет
- // Область для сообщения диалогового окна
- Rectangle {
- /* Прибиваем область к левой, правой и верхней частям диалога,
- * а также снизу к разделителю, который отделяет область от кнопок
- */
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
- anchors.bottom: dividerHorizontal.top
- color: "#f7f7f7" // Задаём цвет области
- // Задаём сообщение диалогового окна
- Label {
- id: textLabel
- text: qsTr("Hello, World!!!")
- color: "#34aadc"
- anchors.centerIn: parent // Помещаем сообщение в центре области для сообщения
- }
- }
- // Создаём горизонтальный разделитель с помощью Rectangle
- Rectangle {
- id: dividerHorizontal
- color: "#d7d7d7"
- height: 2 // Устанавливаем ширину в два пикселя
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.bottom: row.top
- }
- /* Создаём подложку для кнопок в виде объекта Строки
- * В данном объекте для объектов детей не работают некоторые параметры
- * anchors, кроме параметров anchors.top и anchors.bottom
- */
- Row {
- id: row
- height: 100 // Задаём высоту
- // А также прибиваем строку к низу диалогового окна
- anchors.bottom: parent.bottom
- anchors.left: parent.left
- anchors.right: parent.right
- Button {
- id: dialogButtonCancel
- // Растягиваем кнопку по высоте строки
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- // Задаём ширину кнопки на половину строки минус 1 пиксель
- width: parent.width / 2 - 1
- // Стилизуем кнопку
- style: ButtonStyle {
- background: Rectangle {
- color: control.pressed ? "#d7d7d7" : "#f7f7f7"
- border.width: 0
- }
- label: Text {
- text: qsTr("Cancel")
- color: "#34aadc"
- // Устанавливаем текст в центр кнопки
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- }
- }
- // По нажатию кнопки закрываем диалог
- onClicked: dialogAndroid.close()
- }
- // Создаём разделитель между кнопками шириной в 2 пикселя
- Rectangle {
- id: dividerVertical
- width: 2
- // Растягиваем разделитель по высоте объекта строки
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- color: "#d7d7d7" // Задаём цвет разделителя
- }
- Button {
- id: dialogButtonOk
- // Растягиваем кнопку по высоте строки
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- // Задаём ширину кнопки на половину строки минус 1 пиксель
- width: parent.width / 2 - 1
- // Стилизуем кнопку
- style: ButtonStyle {
- background: Rectangle {
- color: control.pressed ? "#d7d7d7" : "#f7f7f7"
- border.width: 0
- }
- label: Text {
- text: qsTr("Ok")
- color: "#34aadc"
- // Устанавливаем текст в центр кнопки
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- }
- }
- // По нажатию кнопки закрываем диалог
- onClicked: dialogAndroid.close()
- }
- }
- }
- }
- }
- }
Итог
В результате у Вас получится Custom Dialog , который уже будет прилично выглядеть на Вашем Android устройстве. Конечно, под декстопом он будет выглядеть ужасно, по крайней мере в этом уроке, но это уже вопрос правильного масштабирования и настроек размеров элементов, которые являются вопросом отдельной статьи.
А вот результат работы диалога на моём смартфоне и десктопе Вы можете увидеть на скриншотах и в видеоуроке.
QML Custom Dialog Desctop
QML Custom Dialog Android
QML Custom Dialog Android, нажата кнопка OK
Немного не понял
Заполнение Row происходит слава направо?
Сначала устанавливаем ButtonCancel потом Вертикальный разделитель и следом ButtonOk
Ну да. Вас смущает последовательность? Можете и наоборот заполнить.
Это из разряда какой вариант юзабилити может быть удобнее. Начитался всяких гайдлайнов от Google да Apple, вот так и написал. А так дело вашего вкуса.