SlideShare a Scribd company logo
全新的Qt5
Qt5帶來的全新功能,模塊和開發模型,將使Qt擁有更美好的未來



              殷允嶠 Charles Yin
         developer @ QML Core Team
           yinyunqiao@gmail.com
自我介紹/About me
• 殷允嶠 (Charles Yin)
• 現居住在澳大利亞昆士蘭州的布里斯班
• 2009年加入Qt Brisbane R&D lab
• 曾經參與的項目
   1. 短暫維護QtSql模塊
   2. Qt Mobility項目中QtContacts, QtOrganizer, QtVersit和
      QtFeedback的研發
   3. 2010年加入QML Core team, 主要負責QtQuickTest研發和維
      護, Canvas組件的設計和實現,QtQuick2 Animation部分的重寫,
      並參與部分性能調整的工作
• 聯絡我: gmail/gtalk/facebook yinyunqiao@gmail.com, twitter:
  yinyunqiao, linkedin: yinyunqiao, IRC@freenode: chayin
Qt5新開發模型:模塊化
git代碼倉庫                                              git://gitorious.org/qt/qlalr.git
                                                     git://gitorious.org/qt/qt3support.git
 https://codereview.qt-project.org/#admin,projects   git://gitorious.org/qt/qtactiveqt.git
                                                     git://gitorious.org/qt/qtbase.git
 http://qt.gitorious.org/                            git://gitorious.org/qt/qtdeclarative.git
                                                     git://gitorious.org/qt/qtdoc.git
                                                     git://gitorious.org/qt/qtmultimedia.git
$ git clone git://gitorious.org/qt/qt5.git           git://gitorious.org/qt/qtphonon.git
$ ./init-repository                                  git://gitorious.org/qt/qtqa.git
                                                     git://gitorious.org/qt/qtrepotools.git
                                                     git://gitorious.org/qt/qtscript.git
                                                     git://gitorious.org/qt/qtsvg.git
                                                     git://gitorious.org/qt/qttools.git
                                                     git://gitorious.org/qt/qttranslations.git
                                                     git://gitorious.org/webkit/qtwebkit.git
                                                     git://gitorious.org/qt/qtwebkit-examples-and-demos.git
                                                     git://gitorious.org/qt/qtxmlpatterns.git
                                                     …
Qt5基本模塊 / Qt5 Essentials Modules

                                   QtWebkit



                 QtMultiMedia
QtTest   QtSql

                 QtQml                        QtQuick


                   QtNetwork                       QtGui


                          QtCore
QtCore: 全新的信號-槽(Signal-Slot)語法

先來溫習一下傳統的信號/槽語法:


connect(sender, SIGNAL(valueChanged(QString,QString)),
        receiver, SLOT(updateValue(QString)) );
QtCore: 全新的信號-槽(Signal-Slot)語法

connect(sender, SIGNAL(valueChanged(QString,QString)),
        receiver, SLOT(updateValue(QString)) );



問題:
• 缺少編譯期語法檢查: 宏 + 字符串
• 對C++類型系統不友好: typedef, namespace, etc.
• 潛在的性能損失: 運行時解析字符串
QtCore: 全新的信號-槽(Signal-Slot)語法

connect(sender, SIGNAL(valueChanged(QString,QString)),
        receiver, SLOT(updateValue(QString)) );




connect(sender, &Sender::valueChanged,
        receiver, &Receiver::updateValue );
QtCore: 全新的信號-槽(Signal-Slot)語法

  connect(sender, &Sender::valueChanged,
          receiver, &Receiver::updateValue );



 • 更符合現代C++語法
                                It’s nicer
                                  now!
The pervasive use of macros in C is probably the
major reason we didn't have excellent C++
development environments a decade ago. -
Bjarne Stroustrup
QtCore: 全新的信號-槽(Signal-Slot)語法

 connect(sender, &Sender::valueChanged,
         receiver, &Receiver::updateValue );


• 編譯期檢查: C++類成員函數指針, 錯誤的信號/槽鏈接將產生
  編譯期錯誤而不是運行時警告
   • 拼寫錯誤
   • 類型不匹配
   • 代碼重構
   • 將可以更多使用 static_assert: 比如當缺少Q_OBJECT時
QtCore: 全新的信號-槽(Signal-Slot)語法

connect(sender, &Sender::valueChanged,
        receiver, &Receiver::updateValue );


• 參數類型自動轉換
 class Test : public QObject {
           Q_OBJECT
 public: Test() {
             connect(this, &Test::someSignal, this, &Test::someSlot);
           }
  signals:
           void someSignal(const QString &);
 public:
              void someSlot(const QVariant &);
 };
QtCore: 全新的信號-槽(Signal-Slot)語法

connect(sender, &Sender::valueChanged,
        receiver, &Receiver::updateValue );


• 任何函數都可成為槽函數, slot 關鍵字, Q_SLOTS宏都將成為過去

 static void someFunction() { qDebug() << "pressed"; }

 // ...
 QObject::connect(button, &QPushButton::clicked, someFunction);
QtCore: 全新的信號-槽(Signal-Slot)語
法
 connect(sender, &Sender::valueChanged,
         receiver, &Receiver::updateValue );

• 使用C++11 lambda匿名函數來編寫槽函數


  QObject::connect(dlg, &QDialog::finished, [=](int result) {
      if (result) {
         QFile file(dlg->selectedFiles().first());
         // ... save document here ... }
        dlg->deleteLater();
  });
QtCore: C++11
•   使用C++11 lambda匿名函數來編寫槽函數
•   更好的Unicode字符串常量 QStringLiteral
•   Q_DECL_CONSTEXPR for constexpr
•   Q_STATIC_ASSERT and Q_STATIC_ASSERT_X
•   auto
•   右值引用/移動構造函數
•   More…

             CONFIG += c++11
QtCore: JSON
•   QJsonArray
•   QJsonDocument
•   QJsonObject
•   QJsonParseError
•   QJsonValue
•   QJsonObject:iterator


       擴展模塊QJsonDB :
         構建在JSON庫之上的高性能Key-Value數據庫
QtGui
       QtQuick2                      QtWebkit               QtQuick1                QWidget



           Scene graph (in qtdeclarative)                                      QPainter
                                                         QBacking
                                                          Store
QSurface                    QOpenGL                                    QFont       QImage       …


 QWindow            QScreen        QOpenGLContext          QAccessible         QInputMethod


                                QPA (Qt platform abstraction)

 Win          Mac          Wayland          X11         Symbian          Android            …
QtGui: QPA (Qt平台抽象層)
讓Qt可以無處不在的秘密武器!




       LightHouse項目
QtGui: QPA (Qt平台抽象層)
唯一的限制是你的想像力!

           Qt/Caca
http://blog.forwardbias.in/2011/07/q
     tcaca-lighthouse-plugin.html
QtGui: QPA (Qt平台抽象層)
使得迅速移植到新的系統平台成為可能!



“Digia plans to quickly enable Qt on
Android, iOS and Windows 8 platforms”
       http://www.digia.com/Qt/About-us/News/Digia-to-Acquire-Qt-from-Nokia/
QtGui: QPA (Qt平台抽象層)
qtbasesrcpluginsplatforms

Cocoa                          Minimal/minimalGL
Directfb                       Qnx
                               Windows
Eglfs
                               Xcb
Kms                            Openwfd
Linuxfb
QtGui: QPA (Qt平台抽象層)
     通過QPA可以控制的GUI功能:

•   Event dispatcher         •   Clipboard
•   Platform window          •   Drag
•   Platform backing store   •   Input method
•   Image paint engine       •   Accessibility
•   OpenGL context           •   Platform theme
•   Font database
QtGui: QPA (Qt平台抽象層)
編寫自己的QPA plugin?

 #include <qpa/qplatformintegration.h>

 class QMyQPAIntegration : public QPlatformIntegration {
 public:
          QMyQPAIntegration ();
          QAbstractEventDispatcher *guiThreadEventDispatcher() const;
          QPlatformWindow *createPlatformWindow(QWindow *window) const;
          QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;

          bool hasCapability(QPlatformIntegration::Capability cap) const;
          QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
          QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
          QPaintEngine *createImagePaintEngine(QPaintDevice *paintDevice) const;
          //…
 };
QtGui: OpenGL
OpenGL現在是QtGUI的一部分,不再通過
單獨的OpenGL模塊提供
•   QOpenGLContext
•   QOpenGLFramebufferObject
•   QOpenGLShaderProgram
•   QOpenGLFunctions
•   QOpenGLPaintDevice
•   …

原有的OpenGL類通過單獨的QtOpenGL擴展模塊提供
QtQml & QtQuick


                     QtQml



     QtDeclarative



                     QtQuick
QtQml & QtQuick in Qt4.x

       QtDeclarative (QML/QtQuick)

                      QGraphicsView
  QtScript
                          QPainter

               Raster Engine       GL Engine
    JSC
                           QtGui
QtQml & QtQuick in Qt5

                   QtQuick
   QtQml
                 Scene graph
                 QWindowSurface
  V8     V4       (OpenGL (ES) 2.0)


  QtNetwork          QtGui

   QtCore             QPA
QtQml


• QML語言核心模塊

• 不再依賴QtQui, 僅依賴QtCore和QtNetwork

• 命令行/服務器端QML開發?
QtQml: Javascript engine


  • JavascriptCore (JSC) => V8
     • QtV8Private (qtjsbackend.git)
     • 更快,更好的GC,優秀的API設計

  • 不再通過QtScript中間層使用Javascript API
QtQml: V4, QML內部的Binding優化


 • 一個輕量級的Javascript引擎

 • 僅用於QML property binding優化目的

 • 比V8還快得多,也小得多
QtQml: QML加載和編譯優化


 • 加載和編譯均可異步完成

  • Qt.createComponent() with Component.Asynchronous
  • Loader {asynchronous:true}
QtQml: 其他增強
• property variant => property var

• Value types
   • QColor
   • Sequence                                            types:
     QList<int>, QList<qreal>, QList<bool>, QList<QUrl>, QList<
     QString> and QStringList

• Module API
   • qmlRegisterModuleApi()

• Javascript import “.import”
QtQuick 2.0



     How was QtQuick 2.0 developed?

     s/QDeclarative/QQuick/g
QtQuick 2.0

• 基於OpenGL scene graph完全重寫全部類

• public C++ APIs
   • QQuickView
   • QQuickWindow
   • QQuickItem
   • QQuickPaintedItem
Scene Graph
Scene Graph




                        QQuickItem::updatePaintNode(…)




(Rendering thread) Scene graph rendering nodes           (Main thread) QML Items
Scene Graph

Node types:

•   Root node
•   Basic node
•   Geometry node
•   Transform node
•   Clip node
•   Opacity node
Scene Graph

    public APIs:

    •   QSGNode and subclasses
    •   QSGNodeVisitor
    •   QSGGeometry
    •   QSGMaterial
    •   QSGMaterialShader
    •   QSGTexture
QtQuick 2.0

Canvas item

 import QtQuick 2.0
 Canvas {
   id:canvas
   width:200
   height:200
   contextType:”2d”
   onPaint : {
        var ctx = context;
         //or var ctx = canvas.getContext(“2d”);
         //use the HTML5 context2d API to draw anything you like
   }
 }
QtQuick 2.0
  Canvas item

• Render targets: Canvas.Image, Canvas.FramebufferObject

• Render strategies: Canvas.Immediate, Canvas.Cooperative,
  Canvas.Threaded

• Tiled rendering: tileSize, canvasSize, canvasWindow
QtQuick 2.0
 Animations

• 完全重寫,不再依賴QtCore animation framework

• 優化內存佔用和執行性能

• 新的動畫元素
  • AnimationController
  • SpriteSequence
  • Sprite
  • AnimatedSprite
QtQuick 2.0
  Text

• Text Rendering in the QML Scene Graph
  http://labs.qt.nokia.com/2011/07/15/text-rendering-in-the-qml-
  scene-graph/
QtQuick 2.0
粒子動畫系統 Particle System

                        ParticleSystem
                       container/timer


     ParticlePainter                         Emmiter
    render particles                      create particles



                           Affector
                        alter particles
QtQuickTest: unit test in QML
Write Quickly => Run Quickly => Test Quickly

import QtQuick 2.0
import QtTest 1.0

TestCase {
  name: "BasicTests"
  function test_pass() {
     compare(2 + 2, 4, "2 + 2")
   }
}
QtQuickTest: unit test in QML

 • TestCase

 • SignalSpy

 • Data driven test

 • QTest compatible APIs

 • more in qtdeclarativetestsautoqmltest
Qt5擴展模塊 / Qt5 Add-ons Modules
30+ 擴展模塊:http://qt-project.org/wiki/Qt-Add-ons-Modules

源自 Qt Mobility:
QtContacts, QtOrganizer, QtVersit, QtLocation, QtBluetooth, QtSens
ors,QtServiceFramework, QtSystemInfo, QtPublishAndSubscribe, Qt
Feedback
源自 Qt4.x: QtConcurrent, QtDBus, QtImageFormats, QtOpenGL,
QtPrintSupport,QtQuick1, QtScript, QtScriptTools, QtSVG, QtTools,
QtWidgets, QtXML, QtXMLPatterns, QtWebkitWidgets

新增: Qt3D, QtGraphicalEffects, QtJsbackend, QtWayland,
QtJsonDB
Demos
New QML Demos in Qt5
                   OpenGL Shaders
                   Distance Field
                   High-Quality Anti-Aliasing
New QML Demos in Qt5

                  Qt5自帶QML演示程序

                  •    Shader effects
                  •    Animated sprites
                  •    Particle system
                  •    Canvas
                  •    Animations
                  •    Localstorage
                  •    XMLHttpRequest

                  Checkout:
                  qtdeclarativeexamplesdemos
New QML Demo in Qt5

                      QtQuick 2.0

                      QtMultimedia

                      QtGraphicalEffects
New QML Demos in Qt5


 更多Qt5演示請到Youtube QtStudios頻道觀
 看,或者搜索Qt5關鍵字。

 http://www.youtube.com/user/qtstudios
全新開發模式 Open Governence
Model

 所有開發活動都在NPO非盈利組織 qt-project.org下完成
 Home: http://qt-project.org
 Code review/CI : http://codereview.qt-project.org
 Bug tracking : http://bugreports.qt-project.org
 Mail list: http://lists.qt-project.org
 Wiki: http://wiki.qt-project.org
 Forum : http://qt-project.org/forums
 Doc : http://qt-project.org/doc
全新開發模式 Open Governence
Model
全新開發模式 Open Governence
Model
                Contributors
•   任何人都可成為qt-project的貢獻者,只要:
•   在bugreports.qt-project.org註冊一個帳號來代表自己
•   訂閱 http://lists.qt-project.org 的郵件列表來參與討論
•   在bugreports.qt-project.org上提交缺陷報告/功能建議
•   在codereview.qt-project.org 提交修復缺陷/新功能的代碼
•   在codereview.qt-project.org上審查別人的代碼
•   編寫文檔/參與討論
•   在論壇/郵件列表/IRC上回答熱情的菜鳥的提問
•   參與各類社區的活動來幫助推廣Qt
全新開發模式 Open Governence
Model
           Approvers
• 有權在他/她了解的範圍內檢查/批准其他人貢獻的代碼
• 當提交代碼時,Approvers不享有特權,他/她們的代碼同樣
  需要別人的檢查和許可,除了極少數例外情況
• 當拒絕別人的代碼時,Approver有義務給出詳細和建設性的意見
• Approver應該積極參與各類社區討論
• 活躍的Contributors通過提名可以成為Approvers
• 幹得不好會被收回權限 
全新開發模式 Open Governence
Model
                Maintainers

   •   Qt各個功能/模塊的技術領導者
   •   對該負責領域的代碼質量負責
   •   負責參與討論和制定該部分的發展方向
   •   是該功能/模塊的默認代碼審查者


        當前Qt項目各個模塊的Maintainers
        http://qt-project.org/wiki/maintainers
全新開發模式 Open Governance
Model
       Chief Maintainer

   • Qt最高技術決策者
   • 維護Qt Open Governance Model正常運作
   • 對Qt的發展做計劃
Qt Brisbane
• 50+ 軟件工程師
• 曾經負責開發Qtopia和後續的QtMobility項目
• QML/QtQuick的老家
• 現在負責的項目有
   • Qt3D
   • QtLocation
   • QtDeclarative
   • QtMultimedia
   • QtSensors
   • QtSystems
   • Qt QA team
   • CI /Release/JIRA
• Approvers/Maintainers權限將保留
• We are looking for new career opportunities!
Qt的未來

• qt-project.org 開放的開發模型,活躍的開源社區
• 開放靈活的授權: GPL/LGPL 或者商業授權
• 龐大的基於Qt的項目數量:
   • KDE, Maya, Skype, VLC, VirtualBox, Mathmatica,
      Dreamworks, Blackberry10, Adobe Photoshop Elements,
      Opera (Linux), Googe Earth
• 投資Qt技術的眾多公司
問
題?

More Related Content

PDF
超酷炫科幻 UI:QML 入門
PPTX
QML 與 C++ 的美麗邂逅
PPTX
Qt 入門就上手 !!
PPTX
Qml 培訓課程 multi media
PDF
Non-MVC Web Framework
PDF
Node.js 進攻桌面開發
PDF
用最潮的 Java script 盡情開發 kde qt 程式
PDF
學好 node.js 不可不知的事
超酷炫科幻 UI:QML 入門
QML 與 C++ 的美麗邂逅
Qt 入門就上手 !!
Qml 培訓課程 multi media
Non-MVC Web Framework
Node.js 進攻桌面開發
用最潮的 Java script 盡情開發 kde qt 程式
學好 node.js 不可不知的事

What's hot (20)

PPTX
QML + Arduino & Leap Motion
PPT
Grails敏捷项目开发
PDF
Noder eyes for frontend guys
PDF
不一樣的Web server... coServ
PPTX
NSCTF
PPTX
All about NodeJS
PDF
Koa 正在等一個人
PDF
PIME - 用 Python 快速開發 Windows 的中文輸入法 (COSCUP 2015)
PPTX
Getting started with test automation
PPTX
Phantom js简介
PDF
MakerBoard: MT7688 Emulator
PPS
基于Android ndk的软件开发简介 放映
PDF
Background processing after android O ft. WorkManager
PDF
在 golang 中透過組合語言實作 SIMD
PPTX
Rwd開發小工具
PDF
使用Javascript及HTML5打造協同運作系統
PDF
用十分鐘瞭解JavaScript的模組 -- 《還有關於npm套件管理的那些事情》
PPTX
这年头,你只需要懂Node webkit
PPTX
Blend4web研究--代码结构
PDF
Using vim
QML + Arduino & Leap Motion
Grails敏捷项目开发
Noder eyes for frontend guys
不一樣的Web server... coServ
NSCTF
All about NodeJS
Koa 正在等一個人
PIME - 用 Python 快速開發 Windows 的中文輸入法 (COSCUP 2015)
Getting started with test automation
Phantom js简介
MakerBoard: MT7688 Emulator
基于Android ndk的软件开发简介 放映
Background processing after android O ft. WorkManager
在 golang 中透過組合語言實作 SIMD
Rwd開發小工具
使用Javascript及HTML5打造協同運作系統
用十分鐘瞭解JavaScript的模組 -- 《還有關於npm套件管理的那些事情》
这年头,你只需要懂Node webkit
Blend4web研究--代码结构
Using vim
Ad

Viewers also liked (20)

PPTX
Qt5 on ti processors
PDF
Fibrosis Quística. Cristina Romero Delgado
PPS
El Mas Alto Del Mundo
PPT
Root Creative Group Portfolio
PDF
Merix Capabilities Ext Na 1 09
PDF
La tendencia de Cloud Computing. Nubes públicas, privadas e híbridas
PPTX
El porfiriato (d.a.v.a.o)
PDF
Curation Technologies for Multilingual Europe
PPTX
Ali divandari’s art work
PPT
Pka praesentation 14_03_2011
PPSX
M-Learning. La sinergia de la educación a distancia y los dispositivos móviles.
PPTX
Grupo 3 a tejón ( Meles meles)
PDF
Estandades en el aula
PPTX
Els patricis ppt
PPTX
techniques of propaganda
PPTX
Curso Spring Roo Spring Data Jpa Maven
PPTX
Formación del caracter del niño
PPTX
Tema 8.La revolución rusa y la URSS
PPTX
Hipérbola
PPT
Qt5 on ti processors
Fibrosis Quística. Cristina Romero Delgado
El Mas Alto Del Mundo
Root Creative Group Portfolio
Merix Capabilities Ext Na 1 09
La tendencia de Cloud Computing. Nubes públicas, privadas e híbridas
El porfiriato (d.a.v.a.o)
Curation Technologies for Multilingual Europe
Ali divandari’s art work
Pka praesentation 14_03_2011
M-Learning. La sinergia de la educación a distancia y los dispositivos móviles.
Grupo 3 a tejón ( Meles meles)
Estandades en el aula
Els patricis ppt
techniques of propaganda
Curso Spring Roo Spring Data Jpa Maven
Formación del caracter del niño
Tema 8.La revolución rusa y la URSS
Hipérbola
Ad

Similar to 全新的Qt5 (20)

PPTX
Overview of Qt/QtQuick Testing, and Study for Qt GUI Automation Testing by Qt...
PDF
使用Qt+和open gl®+创建跨平台可视化ui
PDF
容器與 Gitlab CI 應用
PDF
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
PPT
C++ gui qt
PPT
Qt gui编程
PDF
Python&GUI
PDF
給 iOS 工程師的 Flutter 開發
PDF
Python 于 webgame 的应用
PDF
淺談 Groovy 與 Gradle
PDF
Kubernetes 地端自建 v.s. GKE,哪個更適合你? @Devfest Taipei 2024
PDF
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
PDF
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
PDF
Kubernetes device plugins
PDF
Hello openstack 2014
PPTX
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
PDF
twMVC#44 讓我們用 k6 來進行壓測吧
PDF
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
PDF
基于 FRIDA 的全平台逆向分析
 
PDF
Introduction MQTT in Chinese
Overview of Qt/QtQuick Testing, and Study for Qt GUI Automation Testing by Qt...
使用Qt+和open gl®+创建跨平台可视化ui
容器與 Gitlab CI 應用
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
C++ gui qt
Qt gui编程
Python&GUI
給 iOS 工程師的 Flutter 開發
Python 于 webgame 的应用
淺談 Groovy 與 Gradle
Kubernetes 地端自建 v.s. GKE,哪個更適合你? @Devfest Taipei 2024
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
Kubernetes device plugins
Hello openstack 2014
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
twMVC#44 讓我們用 k6 來進行壓測吧
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
基于 FRIDA 的全平台逆向分析
 
Introduction MQTT in Chinese

全新的Qt5

  • 1. 全新的Qt5 Qt5帶來的全新功能,模塊和開發模型,將使Qt擁有更美好的未來 殷允嶠 Charles Yin developer @ QML Core Team yinyunqiao@gmail.com
  • 2. 自我介紹/About me • 殷允嶠 (Charles Yin) • 現居住在澳大利亞昆士蘭州的布里斯班 • 2009年加入Qt Brisbane R&D lab • 曾經參與的項目 1. 短暫維護QtSql模塊 2. Qt Mobility項目中QtContacts, QtOrganizer, QtVersit和 QtFeedback的研發 3. 2010年加入QML Core team, 主要負責QtQuickTest研發和維 護, Canvas組件的設計和實現,QtQuick2 Animation部分的重寫, 並參與部分性能調整的工作 • 聯絡我: gmail/gtalk/facebook yinyunqiao@gmail.com, twitter: yinyunqiao, linkedin: yinyunqiao, IRC@freenode: chayin
  • 3. Qt5新開發模型:模塊化 git代碼倉庫 git://gitorious.org/qt/qlalr.git git://gitorious.org/qt/qt3support.git https://codereview.qt-project.org/#admin,projects git://gitorious.org/qt/qtactiveqt.git git://gitorious.org/qt/qtbase.git http://qt.gitorious.org/ git://gitorious.org/qt/qtdeclarative.git git://gitorious.org/qt/qtdoc.git git://gitorious.org/qt/qtmultimedia.git $ git clone git://gitorious.org/qt/qt5.git git://gitorious.org/qt/qtphonon.git $ ./init-repository git://gitorious.org/qt/qtqa.git git://gitorious.org/qt/qtrepotools.git git://gitorious.org/qt/qtscript.git git://gitorious.org/qt/qtsvg.git git://gitorious.org/qt/qttools.git git://gitorious.org/qt/qttranslations.git git://gitorious.org/webkit/qtwebkit.git git://gitorious.org/qt/qtwebkit-examples-and-demos.git git://gitorious.org/qt/qtxmlpatterns.git …
  • 4. Qt5基本模塊 / Qt5 Essentials Modules QtWebkit QtMultiMedia QtTest QtSql QtQml QtQuick QtNetwork QtGui QtCore
  • 6. QtCore: 全新的信號-槽(Signal-Slot)語法 connect(sender, SIGNAL(valueChanged(QString,QString)), receiver, SLOT(updateValue(QString)) ); 問題: • 缺少編譯期語法檢查: 宏 + 字符串 • 對C++類型系統不友好: typedef, namespace, etc. • 潛在的性能損失: 運行時解析字符串
  • 7. QtCore: 全新的信號-槽(Signal-Slot)語法 connect(sender, SIGNAL(valueChanged(QString,QString)), receiver, SLOT(updateValue(QString)) ); connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue );
  • 8. QtCore: 全新的信號-槽(Signal-Slot)語法 connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue ); • 更符合現代C++語法 It’s nicer now! The pervasive use of macros in C is probably the major reason we didn't have excellent C++ development environments a decade ago. - Bjarne Stroustrup
  • 9. QtCore: 全新的信號-槽(Signal-Slot)語法 connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue ); • 編譯期檢查: C++類成員函數指針, 錯誤的信號/槽鏈接將產生 編譯期錯誤而不是運行時警告 • 拼寫錯誤 • 類型不匹配 • 代碼重構 • 將可以更多使用 static_assert: 比如當缺少Q_OBJECT時
  • 10. QtCore: 全新的信號-槽(Signal-Slot)語法 connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue ); • 參數類型自動轉換 class Test : public QObject { Q_OBJECT public: Test() { connect(this, &Test::someSignal, this, &Test::someSlot); } signals: void someSignal(const QString &); public: void someSlot(const QVariant &); };
  • 11. QtCore: 全新的信號-槽(Signal-Slot)語法 connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue ); • 任何函數都可成為槽函數, slot 關鍵字, Q_SLOTS宏都將成為過去 static void someFunction() { qDebug() << "pressed"; } // ... QObject::connect(button, &QPushButton::clicked, someFunction);
  • 12. QtCore: 全新的信號-槽(Signal-Slot)語 法 connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue ); • 使用C++11 lambda匿名函數來編寫槽函數 QObject::connect(dlg, &QDialog::finished, [=](int result) { if (result) { QFile file(dlg->selectedFiles().first()); // ... save document here ... } dlg->deleteLater(); });
  • 13. QtCore: C++11 • 使用C++11 lambda匿名函數來編寫槽函數 • 更好的Unicode字符串常量 QStringLiteral • Q_DECL_CONSTEXPR for constexpr • Q_STATIC_ASSERT and Q_STATIC_ASSERT_X • auto • 右值引用/移動構造函數 • More… CONFIG += c++11
  • 14. QtCore: JSON • QJsonArray • QJsonDocument • QJsonObject • QJsonParseError • QJsonValue • QJsonObject:iterator 擴展模塊QJsonDB : 構建在JSON庫之上的高性能Key-Value數據庫
  • 15. QtGui QtQuick2 QtWebkit QtQuick1 QWidget Scene graph (in qtdeclarative) QPainter QBacking Store QSurface QOpenGL QFont QImage … QWindow QScreen QOpenGLContext QAccessible QInputMethod QPA (Qt platform abstraction) Win Mac Wayland X11 Symbian Android …
  • 17. QtGui: QPA (Qt平台抽象層) 唯一的限制是你的想像力! Qt/Caca http://blog.forwardbias.in/2011/07/q tcaca-lighthouse-plugin.html
  • 18. QtGui: QPA (Qt平台抽象層) 使得迅速移植到新的系統平台成為可能! “Digia plans to quickly enable Qt on Android, iOS and Windows 8 platforms” http://www.digia.com/Qt/About-us/News/Digia-to-Acquire-Qt-from-Nokia/
  • 19. QtGui: QPA (Qt平台抽象層) qtbasesrcpluginsplatforms Cocoa Minimal/minimalGL Directfb Qnx Windows Eglfs Xcb Kms Openwfd Linuxfb
  • 20. QtGui: QPA (Qt平台抽象層) 通過QPA可以控制的GUI功能: • Event dispatcher • Clipboard • Platform window • Drag • Platform backing store • Input method • Image paint engine • Accessibility • OpenGL context • Platform theme • Font database
  • 21. QtGui: QPA (Qt平台抽象層) 編寫自己的QPA plugin? #include <qpa/qplatformintegration.h> class QMyQPAIntegration : public QPlatformIntegration { public: QMyQPAIntegration (); QAbstractEventDispatcher *guiThreadEventDispatcher() const; QPlatformWindow *createPlatformWindow(QWindow *window) const; QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const; bool hasCapability(QPlatformIntegration::Capability cap) const; QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const; QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const; QPaintEngine *createImagePaintEngine(QPaintDevice *paintDevice) const; //… };
  • 22. QtGui: OpenGL OpenGL現在是QtGUI的一部分,不再通過 單獨的OpenGL模塊提供 • QOpenGLContext • QOpenGLFramebufferObject • QOpenGLShaderProgram • QOpenGLFunctions • QOpenGLPaintDevice • … 原有的OpenGL類通過單獨的QtOpenGL擴展模塊提供
  • 23. QtQml & QtQuick QtQml QtDeclarative QtQuick
  • 24. QtQml & QtQuick in Qt4.x QtDeclarative (QML/QtQuick) QGraphicsView QtScript QPainter Raster Engine GL Engine JSC QtGui
  • 25. QtQml & QtQuick in Qt5 QtQuick QtQml Scene graph QWindowSurface V8 V4 (OpenGL (ES) 2.0) QtNetwork QtGui QtCore QPA
  • 26. QtQml • QML語言核心模塊 • 不再依賴QtQui, 僅依賴QtCore和QtNetwork • 命令行/服務器端QML開發?
  • 27. QtQml: Javascript engine • JavascriptCore (JSC) => V8 • QtV8Private (qtjsbackend.git) • 更快,更好的GC,優秀的API設計 • 不再通過QtScript中間層使用Javascript API
  • 28. QtQml: V4, QML內部的Binding優化 • 一個輕量級的Javascript引擎 • 僅用於QML property binding優化目的 • 比V8還快得多,也小得多
  • 29. QtQml: QML加載和編譯優化 • 加載和編譯均可異步完成 • Qt.createComponent() with Component.Asynchronous • Loader {asynchronous:true}
  • 30. QtQml: 其他增強 • property variant => property var • Value types • QColor • Sequence types: QList<int>, QList<qreal>, QList<bool>, QList<QUrl>, QList< QString> and QStringList • Module API • qmlRegisterModuleApi() • Javascript import “.import”
  • 31. QtQuick 2.0 How was QtQuick 2.0 developed? s/QDeclarative/QQuick/g
  • 32. QtQuick 2.0 • 基於OpenGL scene graph完全重寫全部類 • public C++ APIs • QQuickView • QQuickWindow • QQuickItem • QQuickPaintedItem
  • 34. Scene Graph QQuickItem::updatePaintNode(…) (Rendering thread) Scene graph rendering nodes (Main thread) QML Items
  • 35. Scene Graph Node types: • Root node • Basic node • Geometry node • Transform node • Clip node • Opacity node
  • 36. Scene Graph public APIs: • QSGNode and subclasses • QSGNodeVisitor • QSGGeometry • QSGMaterial • QSGMaterialShader • QSGTexture
  • 37. QtQuick 2.0 Canvas item import QtQuick 2.0 Canvas { id:canvas width:200 height:200 contextType:”2d” onPaint : { var ctx = context; //or var ctx = canvas.getContext(“2d”); //use the HTML5 context2d API to draw anything you like } }
  • 38. QtQuick 2.0 Canvas item • Render targets: Canvas.Image, Canvas.FramebufferObject • Render strategies: Canvas.Immediate, Canvas.Cooperative, Canvas.Threaded • Tiled rendering: tileSize, canvasSize, canvasWindow
  • 39. QtQuick 2.0 Animations • 完全重寫,不再依賴QtCore animation framework • 優化內存佔用和執行性能 • 新的動畫元素 • AnimationController • SpriteSequence • Sprite • AnimatedSprite
  • 40. QtQuick 2.0 Text • Text Rendering in the QML Scene Graph http://labs.qt.nokia.com/2011/07/15/text-rendering-in-the-qml- scene-graph/
  • 41. QtQuick 2.0 粒子動畫系統 Particle System ParticleSystem container/timer ParticlePainter Emmiter render particles create particles Affector alter particles
  • 42. QtQuickTest: unit test in QML Write Quickly => Run Quickly => Test Quickly import QtQuick 2.0 import QtTest 1.0 TestCase { name: "BasicTests" function test_pass() { compare(2 + 2, 4, "2 + 2") } }
  • 43. QtQuickTest: unit test in QML • TestCase • SignalSpy • Data driven test • QTest compatible APIs • more in qtdeclarativetestsautoqmltest
  • 44. Qt5擴展模塊 / Qt5 Add-ons Modules 30+ 擴展模塊:http://qt-project.org/wiki/Qt-Add-ons-Modules 源自 Qt Mobility: QtContacts, QtOrganizer, QtVersit, QtLocation, QtBluetooth, QtSens ors,QtServiceFramework, QtSystemInfo, QtPublishAndSubscribe, Qt Feedback 源自 Qt4.x: QtConcurrent, QtDBus, QtImageFormats, QtOpenGL, QtPrintSupport,QtQuick1, QtScript, QtScriptTools, QtSVG, QtTools, QtWidgets, QtXML, QtXMLPatterns, QtWebkitWidgets 新增: Qt3D, QtGraphicalEffects, QtJsbackend, QtWayland, QtJsonDB
  • 45. Demos
  • 46. New QML Demos in Qt5 OpenGL Shaders Distance Field High-Quality Anti-Aliasing
  • 47. New QML Demos in Qt5 Qt5自帶QML演示程序 • Shader effects • Animated sprites • Particle system • Canvas • Animations • Localstorage • XMLHttpRequest Checkout: qtdeclarativeexamplesdemos
  • 48. New QML Demo in Qt5 QtQuick 2.0 QtMultimedia QtGraphicalEffects
  • 49. New QML Demos in Qt5 更多Qt5演示請到Youtube QtStudios頻道觀 看,或者搜索Qt5關鍵字。 http://www.youtube.com/user/qtstudios
  • 50. 全新開發模式 Open Governence Model 所有開發活動都在NPO非盈利組織 qt-project.org下完成 Home: http://qt-project.org Code review/CI : http://codereview.qt-project.org Bug tracking : http://bugreports.qt-project.org Mail list: http://lists.qt-project.org Wiki: http://wiki.qt-project.org Forum : http://qt-project.org/forums Doc : http://qt-project.org/doc
  • 52. 全新開發模式 Open Governence Model Contributors • 任何人都可成為qt-project的貢獻者,只要: • 在bugreports.qt-project.org註冊一個帳號來代表自己 • 訂閱 http://lists.qt-project.org 的郵件列表來參與討論 • 在bugreports.qt-project.org上提交缺陷報告/功能建議 • 在codereview.qt-project.org 提交修復缺陷/新功能的代碼 • 在codereview.qt-project.org上審查別人的代碼 • 編寫文檔/參與討論 • 在論壇/郵件列表/IRC上回答熱情的菜鳥的提問 • 參與各類社區的活動來幫助推廣Qt
  • 53. 全新開發模式 Open Governence Model Approvers • 有權在他/她了解的範圍內檢查/批准其他人貢獻的代碼 • 當提交代碼時,Approvers不享有特權,他/她們的代碼同樣 需要別人的檢查和許可,除了極少數例外情況 • 當拒絕別人的代碼時,Approver有義務給出詳細和建設性的意見 • Approver應該積極參與各類社區討論 • 活躍的Contributors通過提名可以成為Approvers • 幹得不好會被收回權限 
  • 54. 全新開發模式 Open Governence Model Maintainers • Qt各個功能/模塊的技術領導者 • 對該負責領域的代碼質量負責 • 負責參與討論和制定該部分的發展方向 • 是該功能/模塊的默認代碼審查者 當前Qt項目各個模塊的Maintainers http://qt-project.org/wiki/maintainers
  • 55. 全新開發模式 Open Governance Model Chief Maintainer • Qt最高技術決策者 • 維護Qt Open Governance Model正常運作 • 對Qt的發展做計劃
  • 56. Qt Brisbane • 50+ 軟件工程師 • 曾經負責開發Qtopia和後續的QtMobility項目 • QML/QtQuick的老家 • 現在負責的項目有 • Qt3D • QtLocation • QtDeclarative • QtMultimedia • QtSensors • QtSystems • Qt QA team • CI /Release/JIRA • Approvers/Maintainers權限將保留 • We are looking for new career opportunities!
  • 57. Qt的未來 • qt-project.org 開放的開發模型,活躍的開源社區 • 開放靈活的授權: GPL/LGPL 或者商業授權 • 龐大的基於Qt的項目數量: • KDE, Maya, Skype, VLC, VirtualBox, Mathmatica, Dreamworks, Blackberry10, Adobe Photoshop Elements, Opera (Linux), Googe Earth • 投資Qt技術的眾多公司