Про Qt5: книжки? примеры? руководства?

По случаю выхода Qt5 Beta2, хочу ею овладеть.

Причем, овладеть по-взрослому, по-мужски!

Ну то есть вот в RawDigger я утомился рисовать собственно GUI на C++, очень хочу делать это декларативно, в грубой форме, на Javascript-е. Особенно это касается всяких форм с большим количеством элементов, но и всего остального гуя - тоже.

Проблема только в том, что я совершенно не представляю себе, как это сделать. Ну то есть этот язык у меня в состоянии "читаю, что-то понимаю, сам написать не могу". При этом, понятно, одним QML+JS у меня никак не обойдется, какие-то core-вещи всяко на C++, а дальше как-то с ними интегрироваться.

Вопрос: а есть ли какие-то систематические источники информации. В свое время пара книжек по Qt4 мне очень помогли. Я их не читал, но пролистал и многое - осознал. Хочу такого же, но для Qt5+QML2. Или не такого же, другого. Каких-то писучих блоггеров, которые про Qt5 пишут, может быть какие-то живые проекты, не знаю. Посоветуйте.

Comments

А у Бланшет+Саммерфельд еще не вышла по qt5 книга очередная? Мне помогли их книги в свое время по 3й и 4й версии, все по полочкам устаканили.)

Пока я не видел. Ну и вообще, на амазоне по слову Qt5 пусто (находится по Qt4 и всякие Qt+HTML5).
Судя по дате выхода книжки по Qt4, раньше чем через полгода после релиза - ждать бессмысленно.

ясно. хотя с другой стороны, если интересует QML - не факт, что у них в книгах он будет хорошо рассмотрен. qml еще в 4ке появился, а в их книге по 4й версии - ни в первом издании, ни втором, со всякими добавлениями - про qml не говорят ничего.. вообще информация по нему какая-то разрозненная везде, нигде толком нет обстоятельного мануала

Ну правильно, QML появился в 4.7 (2010-й год), а второе (и последнее) издание книжки - 2008 вроде бы.

А про разрозненность информации - я полностью согласен. Вот с QML2 (или правильно говорить QtQick2?) та же ровно хрень.
Вроде как все описано даже в доках, а целостная картина не складывается.

глянул сейчас, точно, 2008й, 4 года уже прошло..казалось, что пару лет всего.
а от qml странное впечатление - кажется, что они сами не так заинтересованы в его развитии, если до сих пор нормальной книги даже нет. меня это оттолкнуло от полноценного изучения его, замучаешься статьи искать, ковырять

qml1 был основан на QGraphicsView. Но потом решили сделать SceneGraph поскольку он решает проблемы со сменой шейдеров и добавляет другие ништяки. Одновременно переименовали кучу классов но большой разницы (для пользователя) между qml 1 и qml 2 на сколько я помню нет. Хотя конечно внутренности были переписаны.

Они же вроде не допилили десктопные компоненты для qml2. Да и вроде не обещали.

Ну есть отдельный проект, может что и допилят. Говорю же - вообще нет понимания что и как в этом самом QML.

Да и в Qt5 - тоже. Там же потроха поменяли, может модно/можно/нужно пользоваться совсем другими средствами, чем я в Qt4 привык? Ну вот скажем банальный показ битмепа в QGraphicsView - может весь стек не нужен, а надо прямо OpenGL-ем все разукрашивать?

QGraphicsView оставили но обещали убрать как можно быстрее.
Вместо QGraphicsView QML2 и scenegraph c opengl backend. QML рендерится QQuickView . Это гораздо ближе к железу, вернее к OpenGLES чем было раньше, можно шейдеры прям в QML писать. QML элементы примитивные: Rect, Text, TextInput и все такое. То есть если хочеться, что бы выглядело как в маке или windows надо все слепить из прямоугольников, текста и изоленты. Мы делали компоненты для N9 http://qt.gitorious.org/qt-components/qt-components , соответственно другие парни делают то же самое для desktop http://qt.gitorious.org/qt-components/desktop (мне кажется эти парни Йенс и Алан слепили уже не одну дюжину разных UI framework и компонент).

> Ну вот скажем банальный показ битмепа в QGraphicsView - может весь стек не нужен, а надо прямо
> OpenGL-ем все разукрашивать?
Это делается на qml конечно просто (впрочем на С++ тоже не очень сложно). Можно создать QQuickView передать ему исходничек с qml и все заработает. В qml есть pannable viewport со всякими bounce и overshoot эффектами. QML объекты это QObject то есть легко можно вызываеть одни другими и наоборот. Кстати софтварного рендерера нет, если нет драйверов opengl то не повезло.

На мой взгляд qml имеет смысл когда много анимации, опять же таки, javascript на котором некоторые вещи пишутся быстрее, но исходник сложной странички будет выглядить так же коряво как и в С++. (при условии что появятся нормальные desktop components).
Хотя вот что то похожее на Metro Style UI можно лабать и без них.

Вот тут есть введение http://qt-project.org/doc/qt-5.0/gettingstartedqml.html
Кстати доки вполне себе нормальные. Есть примеры, с описанием.

Да, доки нормальные, в том смысле что понятные. Но общая картина остается какой-то мутной.
Я даже не знаю что спросить конкретно - потому что не знаю половины ответа.

Впрочем, спрошу.
Если оставаться в рамках (понятного мне) C++, а не QML, то что использовать вместо QGraphicsView/QGraphicsScene?

У меня, грубо говоря, есть background (довольно большой, 10-20-80 мегапикселей), по которому нужен zoom и pan, а поверх него всякие объекты с поведением (подрагать мышкой, контекстные меню и т.п.). Background я бы рисовал OpenGL-ем, правда эксперименты с этим с Qt4 были какими-то странными, но я готов еще раз повторить. А по нему - уже объекты.
Сейчас эти объекты - это QGraphicRectItem или что-то подобное с перехваченными евентами.

> У меня, грубо говоря, есть background (довольно большой, 10-20-80 мегапикселей)
Вариантов несколько. Можно сделать свой контрол на основе QGLWidget, а можно и QML. Пожалуй для этого в QML все есть. Я сходу не нашел QWidget который мог бы показать результать рендеринга QQuickView. Раньше был qgraphicsview и его легко можно было показать как widget.

Но QQuickView возвращает QOpenGLFramebufferObject который можно потом отрендерить в том же QGLWidget. Из QQuickView можно вытянуть engine а в него засунуть исходничек с qml.
Евенты из QGLWidget нужно будет рутить в QQuickView. Впрочем это навскидку и возможно есть попроще способ сделать из QQuickView widget.

элементы qml это qobject. Cпец компилятор транслирует их в qobject и добавляет разные properties. Так что скорее всего собственный велосипед в скорости не будет отличатся от QtQuick.
Нужно глянуть насколько сложные те самые дополнительные объекты и имеет ли смысл добавлять qml из них. Для простого вьювера мне кажется овчинка выделки не стоит. Хотя qml позволяет иметь скорость почти прямого использования opengl без использования его api напрямую.

Я когда то пару слайдов делал по QML2 могу заслать куда нибудь. Только keynote нужен.

Давайте я еще подробнее спрошу.
Вот у меня "сампл" - это такой прямоугольник, который унаследован от QGraphicsRectItem и у которого в конструкторе:

setZValue(SAMPLE_ZVALUE);
setFlag(QGraphicsItem::ItemIsMovable,1);
setFlag(QGraphicsItem::ItemSendsScenePositionChanges,1);
setCursor(Qt::OpenHandCursor);

И еще у него есть

void RD_Sample::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){}


В результате - я получаю объект, который можно двигать мышкой, по окончанию движения там нечто пересчитывается, двигать за пределы background я его не даю в itemChange, ну и контекстное меню у него есть.

"Делать свой контрол на основе QGLWidget" - это же означает, что всю вышеописанную функциональность, которую мне дает QGraphicsScene сотоварищи - реализовывать ручками?

Ну а зачем мне ручками? Я тогда по старинке зароучу QGraphicsView::setViewPort() в QGLWidget и вуаля?

Ну то есть или QML, это понятно. Хотя с генерацией/удалением объектов там придется как-то разбираться, пока совсем не вкурил.

> Ну а зачем мне ручками?
Я видимо не правильно вас понял. Я думал qgraphicsview чем то не устраивает, и хотелось бы что нибудь другое. Значит QGlWidget не вариант. Я не понимаю зачем что то менять если qgraphicsview работает. Его наверняка порежут, но это случится не завтра. Про "как можно быстрее" мне говорили девелоперы, но от них не всегда зависят. Другой девелопер говорил что на qgraphicsview вообще много написано и даже не смотря на то что это какашка, менять они его не могут.

В QML нет itemов которые бы можно было дергать мышкой и получить context menu event. Там есть Rectangle и MouseArea, и соединить их надо ручками. И контекст меню рисовать руками. Ну или взять qml desktop components. Если оно там есть.

Создавать и удалять объекты легко. Qt.createQmlObject. http://qt-project.org/wiki/QML-Dynamic-Objects

> Я так понимаю, что "обещали убрать", но никакой замены *пока* нет? Те же возможности, но с другим API
Замена это QtQuick и QML. Но функционал не 1:1 конечно.

QGraphicsView меня вполне устраивает.
Но раз его хотят выпилить - я и хотел сразу использовать замену. Только из тех соображений, что эту самую замену заранее пощупать за вымя. Но QML *без* десктоп-компонентов такой заменой не является.

В-общем, настала ясность более-менее, спасибо. А ясность в моем случае такая
- большой битмеп рисуем OpenGL, раз уж Qt5 его требует и оно везде есть
- остальное - пока по старинке, а там посмотрим.

Вроде обещают desktop components доделать
http://www.digia.com/ru/Digia/1/News/Qt15112012/
Там и видео есть с примерчиками.

Да, я видел. Ну деваться некуда, если уж взялись все на QML.

BTW, в Beta2 скачанной с сайта - OpenGL-примеры в QML - не работают. У той что скачивал пару дней назад и собирал сам - работали не все (базовые работали, а плагин с материалами профукался). Мне они не то чтобы нужны сейчас, но обидно.

Базовые OpenGL-примеры (с QGLWidget) - работают т.е. дело не профуканной поддержке.

Пока desktop components (взятые с git://gitorious.org/qt-components/desktop.git, пробовал бранчи qt5 и HEAD) - просто под Qt5Beta2 не собираются. Может от того, что компилятор не Tier1

Ну и хрен с ними.

Да и с 2012 вижуалом что то не завелось. Пичаль и фэйспалм какойто.

Да, с 12-м - странный фейспалм - через Makefile все работает, проекты для визуальной среды какие-то кривые генерируются.

Добился вроде с 2012-м. Хотя и сексуально
1) Пересобираем Qt 2012-м компилятором.
2) При работе со своим проектом:
- ставим пути к 2010-му VC++ и QMAKESPEC=win32-msvc2010
- запускаем qmake -tp vc
- получившийся проект (для 2010-го) - апгрейдим 2012-м при первом открытии.

Вот так - все работает. Генерированный для 2012-го проект, равно как и генерированный для 2010-го (spec win32-msvc2010) но c путями к тулчейну в 2012-й - не работают.

Не, ну я туп, конечно, но это место знаю.

Но это - не то место. Вот по Qt4 - была разница между помянутыми тут книжками и референсом. Сначала книжки, потом референс. Хочу того же про QML2

QML, в принципе, появился до qt5 и его можно изучать по книжкам до qt5 (если есть такие).
На dev days в прошлом году сильно рекламировали мультики: http://qt-project.org/videos#t-qt~quick
От Qt Quick 2 отличается от 1го тем, что он на базе scenegraph (а не QGraphicsView) и сильно завязан на opengl. Вроде говорят, что всё таки будет fallback для qt5 без opengl, но пока что у меня без opengl оно не работало.

Меня уже попросвещали и я исходники поглядел (просто в имена файлов).

Я верно понимаю, что если я хочу без QML, просто на С++, по старинке, то никакого scenegraph мне не дают и надо пользоваться все тем же QGraphicsView, хотя это несовременно и все такое.

Fallback на винде без OpenGL2 - это ANGLE (реализация OpenGL ES поверх DX9), насколько я понял.

Но мне без OpenGL2 (не ES) неинтересно - я такие старые машины просто поддерживать не хочу (пока и в тестовом проекте). И борюсь с искушением хотеть еще и float-текстур.

> то никакого scenegraph мне не дают

Почему же.
Подключить модуль quick, создать QWindow и вперёд.
Проблема в том, что все UI компоненты сделаны в QML. На це - только основные айтемы для отрисовки.
В QGraphicsView там хоть был QGraphicsProxyWidget - всегда можно было взять какой нибудь старый QWidget, который бы работал слегка медленнее, но без каких либо изменений. В сценеграфе ничего такого нет. На уровне QML обещают совместимость с 1м квиком, а в сценеграфе - всё заново писать.
Есть, правда, QQuickPaintedItem, которые позволяет использовать QPainter для рисования, но:

1. Оно не предназначено для частых апдейтов.
2. Оно не работает с отдельным тредом для отрисовки (во всяком случае - не работало пол года назад).
3.

Но QWidget и QGraphicsView никуда не делись.

> Fallback на винде без OpenGL2 - это ANGLE (реализация OpenGL ES поверх DX9), насколько я понял.

Угу. Оно изначально было для DX. Сейчас вроде хотят сделать ещё и для других платформ. Я правда не понял нахрена, т.к. есть уже mesa и llvm.

> И борюсь с искушением хотеть еще и float-текстур.

Да вроде FP textures даже в ES версии много где есть.
Проблема, что придется всё равно писать фолбэк если нет OES_texture_float .

3. Не дописал - отвлекли.

Жрёт память под render buffer.

>Подключить модуль quick, создать QWindow и вперёд.
И чего вперед то? Вот хочу нарисовать квадратик, который можно возить мышкой и с контекстным меню по правой кнопке мыши и еще чем-нибудь хорошим. И? Вот банально контекстное меню?
Это все было в QGraphics*
Руками как-то западло все это программировать самому

Понимаю, оно несовременно и на экране телефона смотрется не будет, но мне не на телефон а на десктоп с 30" монитором и мышкой.

>Но QWidget и QGraphicsView никуда не делись.

Ну какбы мне пишут QGraphicsView оставили но обещали убрать как можно быстрее.

Я так понимаю, что "обещали убрать", но никакой замены *пока* нет? Те же возможности, но с другим API

> Руками как-то западло все это программировать самому

В це насколько я знаю - только ручками.
Для QML есть компоненты, но я давно не смотрел.
Т.е. для специфических айтемов нужно делать qml plugin, а потом использовать его в qml.

>Но QWidget и QGraphicsView никуда не делись.
>Ну какбы мне пишут QGraphicsView оставили но обещали убрать как можно быстрее.
>Я так понимаю, что "обещали убрать", но никакой замены *пока* нет? Те же возможности, но с другим API

Ну, если Дубик пишет, то его нужно и спрашивать ;) Он там рядом с кьютописателями ;)

Рисовать GUI декларативно можно и на wxWidgets например: http://eax.me/tag/wxwidgets/

Можно, наверное (ничего про это не знаю, google:wxwidget declarative programming ничего приличного не выдает).

Но так как обсуждаем мы другое, то ссылочку вашу я того...