Пользователь
0,0
рейтинг
22 июня 2013 в 18:47

Разработка → Грядущие вкусняшки в Qt Quick

В блоге Qt появился обзор, предстоящих нововведений в Qt Quck в грядущей 5.1. Если вкратце, они добавили функционал виджетов, аналог QMainWindow и дали возможность использовать QML в виджет-проектах, правда в несколько усеченном варианте. Таким образом Qt Quick готов для разработки приложений и на десктопах.

Нам дали практически все то, что привыкли видеть в виджетах. Первое и самое пожалуй важное это компоновщики:
image
В чем собственно проблема. В виджетах компоновщики представляют собой удобный инструмент, когда дело доходит до изменения размеров отображаемого окна. до Qt 5.1 в QML подобный функционал тоже было можно реализовать, но сейчас стало проще. В пример можно привести, код из этой статьи:

До:
ToolBar {
    Row {
        id: row
        spacing: 2
        anchors.verticalCenter: parent.verticalCenter
        ToolButton { iconSource: "images/go-previous.png" }
        ToolButton { iconSource: "images/go-next.png" }
    }
    Slider {
        anchors.left: row.right
        anchors.leftMargin: 2
        anchors.verticalCenter: parent.verticalCenter
        anchors.right: parent.right
    }
}

После:
ToolBar {
    RowLayout {
        anchors.fill: parent
        spacing: 2
        ToolButton { iconSource: "images/go-previous.png" }
        ToolButton { iconSource: "images/go-next.png" }
        Slider { Layout.fillWidth: true }
    }
}


Добавили несколько View классов (или как их там): SplitView, ScrollView и TableView
image
Последний аналог QTableView и это классическое табличное представление, ScrollView является неким аналог QAbstractScrollArea, SplitView — аналог QSplitter.

Добавили классические элементы управления:
image
И дали возможности гнуть как душе угодно, ровно как и VIew-ры.

И вот так нам предлагают всем этим пользоваться:
GroupBox {
    id: gridBox
    title: "Grid layout"
    Layout.fillWidth: true

    GridLayout {
        id: gridLayout
        anchors.fill: parent
        rows: 3
        flow: GridLayout.TopToBottom

        Label { text: "Line 1" }
        Label { text: "Line 2" }
        Label { text: "Line 3" }

        TextField { }
        TextField { }
        TextField { }

        TextArea {
            text: "This widget spans over three rows in the GridLayout.\n"
                  + "All items in the GridLayout are implicitly positioned from top to bottom."
            Layout.rowSpan: 3
            Layout.fillHeight: true
            Layout.fillWidth: true
        }
    }
}

Ну что ж, по крайней мере это не стало сложнее, а вкупе с изначальными возможностями qml оставаться верным виджетам я уже смысла не вижу

Ссылки


@DancingOnWater
карма
3,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (15)

  • +3
    Супер!

    Читал об экспериментах с виджетами ещё около двух лет назад, наконец-то они включили этот код в основную ветку.
    • +2
      Строили-строили и наконец построили. Как выйдет Qt Creator 2.8 надо посмотреть как он поддерживает нововведения.
      • +1
        Ну, во времена описываемого vitaly_KF эксперимента креатор ещё той версии умел показывать быстрые контролы в дизайнере. А что ещё от него требуется?
        Мне вот ещё QQmlApplicationEngine понравился и переключение табом, зря, наверное, вы про это не написали.
        • 0
          Нук, к примеру, как он работает с Layout-ами.
          Может быть, новости это не мой стиль, но просто столь долгожданная новость про Desktop components, вот и не удержался.
          • 0
            Ну если бы меня не вывели подышать свежим воздухом, то вы бы так и не успели и удержались. :) Но мне понравилось, что вы привели примеры кода, я делал простой перевод.

            Нук, к примеру, как он работает с Layout-ами.

            С Row и Column работал нормально. Так или иначе, RC же есть, надо установить да попробовать.
  • +2
    думаю, зачем они нам нужно и почему их не хватало на десктопах думаю не надо.

    Конечно, так ведь лень перевести несколько предложений из той же блогозаписи:
    While anchors and basic positioners have previously provided great flexibility with Qt Quick, they can sometimes become tedious, verbose or complex when dealing with resizable user interfaces. By adding QtQuick.Layouts as a compliment to the existing anchor based methods, you can now build complex resizable layouts, respecting minimum, maximum size hints and declare items as expanding or fixed in a simple and declarative way.

    Ну что же, мне лень:

    Не смотря на то, что якоря и основные позиционеры ранее обладали большой гибкостью в Qt Quick, иногда они становились нудными, многословными и сложными, когда дело касалось масштабируемого пользовательского интерфейса. Теперь, используя QtQuick.Layouts в дополнение к существующим методам, основанным на якорях, появилась возможность строить сложные масштабируемые макеты, соблюдающие указания по минимальному и максимальному размерам элементов, и объявлять элементы как расширяемые или фиксированные простым декларативным способом.
    • +1
      Подозреваю чуток переработанный Google translate я. (из невысказанных речей мастера йода).

      На самом деле, этот абзац практически ничего не объясняет.Чуток больше конкретики можно выудить из более ранней записи.

      До:
      ToolBar {
          Row {
              id: row
              spacing: 2
              anchors.verticalCenter: parent.verticalCenter
              ToolButton { iconSource: "images/go-previous.png" }
              ToolButton { iconSource: "images/go-next.png" }
          }
          Slider {
              anchors.left: row.right
              anchors.leftMargin: 2
              anchors.verticalCenter: parent.verticalCenter
              anchors.right: parent.right
          }
      }
      

      После:
      ToolBar {
          RowLayout {
              anchors.fill: parent
              spacing: 2
              ToolButton { iconSource: "images/go-previous.png" }
              ToolButton { iconSource: "images/go-next.png" }
              Slider { Layout.fillWidth: true }
          }
      }
      

      Но на самом деле, тут еще надо сравнивать с подходом, уже присутствующий в виджетах.
      • +1
        Ну, во-первых, не Гугл Транслейт. Сами проверьте, как он переводит тот абзац, если вам опять не лень, конечно.

        А, во-вторых, суть моего предыдущего комментария заключается в том, что ценность вашей статьи стремится к нулю: те, кто связаны с разработкой на Qt и так уже знают или в скором времени узнают об этих нововведениях. А те, кто не связан, но каким-то местом интересуются (как я, например), так ничего из вашей новости и не поняли.

        Вот сложно было в самой статье привести в качестве примера эти два куска кода для наглядности?
        • +2
          Проверил, если честно — очень похоже :) Но это не ввину вам, а вину самого абзаца, в его невнятной структуре.

          Спасибо, действительно, не подумал. Обязательно допишу, а от вас жду еще дельной критики :)
  • +2
    Всплывающие подсказки не отрабатывают, редактируемые поля (TextArea, TextEdit и т. д.) по-прежнему не реагируют на правый клик, фокусирование произвольно скачет. Естественно, можно наследоваться от элементов и попытаться реализовать нормальное поведение, но стоил ли овчинка выделки, если есть нормальные qt-виджеты вне quick?

    И хоть теперь хотя бы у стандартных элементов нормальная реакция на двойные-тройные клики, до десктопа ещё далеко. Впрочем, на мобильных устройствах оно уже давно «pretty neat».
    • +3
      Вообще, очень смешанные чувства вызывает QML и QtQuick. С одной стороны — декларативный подход к макетам интерфейса мне кажется очень хорошей идеей, а с другой стороны — мало того, что для того, что бы пользоваться Qt Quick надо кроме глубоких познаний в Qt по-факту знать три языка: QML, JavaScript и С++, так оно ещё и часто-густо не работает или работает как-то странно. Например:
      • До недавнего времени, (в 5.0.1, в 5.1.0 ещё не проверял) в присутствии окон со свойством OnTop ко всем MouseArea элементам переставал приходить Release.
      • Не существует (по заверениям поддержки digi'ии) способа сделать View наполненный интерактивными элементами, который не будет обладать Flickable свойством пока элементы влезают в одну страницу на View.
      • Из делегата Repeater'а всё ещё никак нельзя получить доступ к модели, кроме как наделяя делегат знаниями о том, что он используется внутри Repeater'а.
      • Документацию на QML тесты похоже что удалили. В 4.7 она достаточно подробная. В 5.1.0 beta там два с половиной слова.
      • 100500 рандомных, с моей точки зрения, warning'ов, которыми сыпет плюсовая часть QtQuick'а во время работы.

      И это только то, что я смог вспомнить в воскресенье утром спросонья. Ну, т.е. я надеюсь, что QtQuick как-то разовьется и будет хорошим удобным инструментом, но сейчас мне это напоминает приход Qt 4, если вы понимаете о чем я.
  • +1
    А оно по-прежнему реализовано на QML? Перефразирую — когда я смотрел, там был с++ класс, к-ый отвечает за рисование стилем, а все элементы были написаны поверх него на QML. Кажется, что реализовать полный функционал виджетов на одном QML достаточно сложно. К примеру — их новый комбобокс поддерживает редактирование и возможность подменить попап виджет на свою вьюху? Что с комплитером/валидатором? Что с кнопками — в них можно втыкать меню? Когда я смотрел, этого не было. Что-нибудь изменилось?
    • 0
      Там есть плюсовые расширения, но большая часть написана на чистом qmlе.
  • 0
    Вообще штука еще несколько глючная, местами странная, но для всяких хитрых интерфейсов уже вполне удобная. Из фич пока бывает деревьев не хватает настоящих.
  • 0
    В начале статьи Quck, а не Quick (:

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.