Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Qt Hybrid Apps

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ynonperek ynonperek
August 06, 2012
290

Qt Hybrid Apps

Avatar for ynonperek

ynonperek

August 06, 2012
Tweet

Transcript

  1. Native Is Broken • Deployment is pain • Change is

    complex for users • Managing versions is a pain for devs Tuesday, February 14, 2012
  2. Qt Is Broken • Writing a unique UI is not

    easy • Can’t reuse code from existing web apps Tuesday, February 14, 2012
  3. Hybrid is the new App • Enjoy constant deployment -

    like a web site • Enjoy unique UI • Enjoy native code Tuesday, February 14, 2012
  4. Hybrid Arch • Native Qt wrapper acts as a browser

    • All User Interface and Application logic is coded in JS • Extra functionality is provided in C++ Qt C++ (Native Code) HTML/JS/CSS Tuesday, February 14, 2012
  5. Hybrid Code • A special object is inserted to JS

    from the Qt wrapper application • Calling methods on this object leads to execution of code in C++ • Defaults to single-threaded Tuesday, February 14, 2012
  6. Hybrid: When • Flexible or unique UI • Reuse existing

    web code • Embed dynamic content from the net • Thin Client • An experienced FED on your team Tuesday, February 14, 2012
  7. Hybrid: Code • QWebPage is a QObject designed to view

    and edit web documents • QWebFrame is a QObject representing a frame or iframe in a page • QWebView is a QWidget capable of displaying QWebPage Tuesday, February 14, 2012
  8. Bridging The Gap Use Qt Webkit Bridge to connect web

    content with native code http://www.flickr.com/photos/groundzero/73471268/ Tuesday, February 14, 2012
  9. Accessing QObjects • By default, no QObject is accessible through

    the web environment • Call QWebFrame’s addToJavaScriptWindowObject to add a QObject Tuesday, February 14, 2012
  10. Accessing QObjects // QWebView has a page() method to return

    // the active QWebPage QWebFrame *frame = myWebPage->mainFrame(); frame->addToJavaScriptWindowObject("someNameForMyObject", myObject); // ... Tuesday, February 14, 2012
  11. Invokable Methods • All slots in the QObject can be

    invoked from JS • Can use Q_INVOKABLE to define an invokable method class Zombie : public QObject { Q_OBJECT public: Q_INVOKABLE void eatBrain(); Q_INVOKABLE int attack(); void rest(); public slots: void walk(QString where); }; Tuesday, February 14, 2012
  12. Signal & Slots • Signals & Slots are used to

    call JS Code from C++ • Define a signal in the QObject • Use connect to bind that signal to a JS function Tuesday, February 14, 2012
  13. Signals & Slots • Assume Zombie was added to the

    page and named Zombie • Arguments must match class Zombie : public QObject { Q_OBJECT signals: void scream(int volume); }; function freeze_in_panic(volume) { // Oh no it’s the end-of-the-world } Zombie.scream.connect(freeze_in_panic); Tuesday, February 14, 2012
  14. Passing Data • Arguments are converted when passed between native

    & web • Failure to match arguments may cause application to crash • Test Everything Tuesday, February 14, 2012
  15. Data Types • Numbers • Strings • Date & Time

    • Regular Expressions • Lists • JSON Objects • QVariants • QObjects • Pixmaps & Images • Web Elements Tuesday, February 14, 2012
  16. Numbers • Qt numeric types: int, short, float, double, qreal,

    qint • JavaScript only has Number • Typedefed numbers are not automatically converted Tuesday, February 14, 2012
  17. Strings • JavaScript’s String is easily translated to QString •

    Using other types in JS will cause the bridge to attempt conversion by calling toString() Tuesday, February 14, 2012
  18. Date & Time • Qt has: QDate, QTime & QDateTime

    • JS has: Date • If JS passed a number to a slot that expected a date, it will be treated as a timestamp Tuesday, February 14, 2012
  19. Regular Expressions • JavaScript RegEx objects are translated to QRegExp

    • Can also pass a string Tuesday, February 14, 2012
  20. Lists • If a slot expects a list, and passed

    an Array, the bridge will try to convert each element. • Use QVariantList to play safe Tuesday, February 14, 2012
  21. JSON Objects • A JSON Object translate well to QVariantMap

    • Use for complex data structures Tuesday, February 14, 2012
  22. QVariants & QObjects • It’s possible but not recommended to

    pass QVariants & QObjects as is • For QObject, pass a pointer to expose functionality • Cannot pass any QObject derived Tuesday, February 14, 2012
  23. Pixmaps & Images • A QImage or QPixmap is converted

    to a JS object similar to the right • Can send img element from web to native { width: ..., height: ..., toDataURL: function() { ... }, assignToHTMLImageElement: function(element) { ... } } Tuesday, February 14, 2012
  24. QWebElement • Represents a DOM node inside Qt • Used

    to write custom renderers or extensions to the environment • Not thread-safe Tuesday, February 14, 2012
  25. Hybrid Tips • Write as little logic as possible in

    the bridge object • Consider a separate worker thread • Get serious about JavaScript Tuesday, February 14, 2012