Qt Everywhere: a C++   abstraction platformGianni Valdambrini (aleister@develer.com)
C++ and portability issues   Is C++ portable? Yes, theoretically...   Standard library is too tiny:       No filesystem...
C++ and portability issues   Real-world C++ programmers have to use libraries for    everything       Some libraries are...
C++ and portability issues   Windows programmers use Win32 API        But Microsoft only improves .NET framework!      ...
Qt to the rescue!   Qt is not only a GUI toolkit: its also a complete    portability layer!       Even for command line ...
Qt Portability Layer   QtCore       Data structures, rich types, system information,        reactor (event loop), multi-...
QtCore: quick overview   QtCore is very “wide” but not “deep”        Many simple classes        But lots of them!   Ex...
QtCore: Implicit sharing   Many Qt classes use “implicit sharing”   Each instance is actually a pointer to shared data, ...
QtCore: Implicit sharing   Returning by value offer more readable API:       QList<QObject> c = obj->children();       ...
Text processing   Qt offers many good primitives for text processing.   QFile: line-by-line processing   QRegExp: Perl ...
QtCore: strings (1/3)   QString: unicode strings representation   Implicit sharing policy: pass by value!   Well-suited...
QtCore: strings (2/3)   Basic: constructor, resize(), [] / .at(), .size(), .resize(),    .fill()   Modification: .append...
QtCore: strings (3/3)   Conversion to: .toUpper(), .toLower(), toInt(),    .toDouble(), .toAscii(), .toLatin1(), .toUtf8(...
QtCore: date/time support                  (1/3)   QDate: one instance is one specific calendar day       Formatting: .{...
QtCore: date/time support                  (2/3)   QTime: one instance is one specific time (instant)       Formatting: ...
QtCore: date/time support                  (3/3)   QDateTime: an instance is one specific calendar time at    a specific ...
STL containers   STL containers are good because:       They are standard C++       They are ready-to-use and very effi...
Qt Containers   Designed “the Qt way”       Easy to use, no complex stuff   Implicitly shared       You can pass by va...
Qt Containers   QList<>, QLinkedList<>, QVector<>       QList<> is an array of pointers            Random access       ...
Qt Containers   QVector<> is an array of objects                    Occupy contiguous space in memory                  ...
Qt Containers   QHash<>, QMap<>       Associative arrays (map values to keys)       QHash<> relies on qHash() and opera...
Qt / XML parsers           Stream based                DOM   QXmlReader               QtDom*          SAX2             ...
QXmlReader   SAX2 only http://www.saxproject.org   not validating, namespace support   SAX2 parsing is callback based  ...
QDom*   in memory representation of the XML document   follow the W3C recommendations   useful to manipulate the XML do...
QtNetwork   Qt module to make networking programs           QtGui not required   high-level classes           for http...
QtNetwork           high level classes          low level classes   QNetworkAccessManager          QTcpServer   QFtp   ...
QtNetwork   QMetworkAccessManager          event driven → the event loop must be running          QNetworkRequest      ...
QtNetwork   QNetworkDiskCache           simple, disk based, cache           QAbstractNetworkCache for a custom cache  ...
Any Questions? ?               29
GRAZIE !                                Develer S.r.l.                             Via Mugellese 1/A                      ...
Upcoming SlideShare
Loading in...5
×

Qt everywhere a c++ abstraction platform

1,152

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,152
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Qt everywhere a c++ abstraction platform

  1. 1. Qt Everywhere: a C++ abstraction platformGianni Valdambrini (aleister@develer.com)
  2. 2. C++ and portability issues Is C++ portable? Yes, theoretically... Standard library is too tiny:  No filesystem access  No network  No multiprocessing/multithreading  No serious unicode support  ... and its not going to change in C++0x! 2
  3. 3. C++ and portability issues Real-world C++ programmers have to use libraries for everything  Some libraries are good, some are bad  Some are portable, some are not  Some become unmaintained after a while  ... big mess! 3
  4. 4. C++ and portability issues Windows programmers use Win32 API  But Microsoft only improves .NET framework!  Naked Win32 API is a pain to use! Linux programmers use POSIX  POSIX is mostly C-oriented  Its totally useless for Windows Mac C++ programmers are doomed  Either POSIX or Carbon...  Cocoa is for Objective-C only! 4
  5. 5. Qt to the rescue! Qt is not only a GUI toolkit: its also a complete portability layer!  Even for command line applications Lots of carefully designed and very mature classes for everyday C++ programming  Prefer quick everyday usability over “abstract perfection”  Fast to learn, fast to use, compact code 5
  6. 6. Qt Portability Layer QtCore  Data structures, rich types, system information, reactor (event loop), multi-threading QtNetwork  Sockets, IP, TCP, UDP, HTTP, FTP, SSL QtXml  Full DOM implementation  SAX2 parser QtWebKit  Web browser engine, used by Safari/Chrome 6
  7. 7. QtCore: quick overview QtCore is very “wide” but not “deep”  Many simple classes  But lots of them! Exploring all it would require a full training on its own!  We will just see some random examples, that will show the typical design of QtCore classes  Easy to use, and very powerful 7
  8. 8. QtCore: Implicit sharing Many Qt classes use “implicit sharing” Each instance is actually a pointer to shared data, with a reference counter Net result: fast pass-by-value, easier code, less performance bugs. Fully multithreaded safe  No mutex/locks, use CPU-specific atomic increments/decrements. 8
  9. 9. QtCore: Implicit sharing Returning by value offer more readable API:  QList<QObject> c = obj->children();  Chainability: obj->children().count();  Can also nest containers with no overhead With STL containers, it would have been:  list<QObject> c; obj->children(c);  Using an argument as return value is bad for readability! 9
  10. 10. Text processing Qt offers many good primitives for text processing. QFile: line-by-line processing QRegExp: Perl regular expressions (many methods accept it, even findChildren()!) QString: many powerful methods (inspired by Perl) 10
  11. 11. QtCore: strings (1/3) QString: unicode strings representation Implicit sharing policy: pass by value! Well-suited for text, dont use for binary data  QByteArray is better for 8-bit binary data Contains loads of functionality for any kind of text processing 11
  12. 12. QtCore: strings (2/3) Basic: constructor, resize(), [] / .at(), .size(), .resize(), .fill() Modification: .append(), .prepend(), .insert(), .replace() (RX), .remove() (RX) Whitespaces: .trimmed(), simplified() Grouping: .split() (RX), .join() Searching: .indexOf(), .lastIndexOf(), .find() (RX), . {starts|ends}With(), .contains() (RX), .count() (RX) Comparison: <, <=, ==, >=, >, ::localeAwareCompare() 12
  13. 13. QtCore: strings (3/3) Conversion to: .toUpper(), .toLower(), toInt(), .toDouble(), .toAscii(), .toLatin1(), .toUtf8(), .toLocal8Bit(), toUcs4() Conversion from: like above, ::number(n,base) Formatting: .sprintf() (bad), .arg() (good)  Use %number formatting instead of %type (like printf)  Fully type-safe  More translator-friendly (can safely-reorder) ... and much more! 13
  14. 14. QtCore: date/time support (1/3) QDate: one instance is one specific calendar day  Formatting: .{to|from}String() (ISO or locale)  Weeks: .weekNumber(), .dayOfWeek()  Jumping: .addDays/Months/Years()  Texts: ::{long|short}{Day|Month}Name()  Validation: ::isLeapYear(), ::isValid()  Ordering: <, <=, ==, >=, >, .daysTo()  Factory: ::currentDate() 14
  15. 15. QtCore: date/time support (2/3) QTime: one instance is one specific time (instant)  Formatting: .{to|from}String() (ISO or locale)  Jumping: .addSecs(), .addMSecs()  Validation: ::isValid()  Measuring: .start(), .restart(), .elapsed()  Ordering: <, <=, >=, >, .secsTo(), .msecsTo()  Factory: ::currentTime() 15
  16. 16. QtCore: date/time support (3/3) QDateTime: an instance is one specific calendar time at a specific time (instant)  Combination of the previous two, merging all the functionalities!  Time formats: Localtime/UTC 16
  17. 17. STL containers STL containers are good because:  They are standard C++  They are ready-to-use and very efficient  The generic iterator concept is powerful STL containers are bad because:  They are verbose to use (eg: iterating)  They are incomplete  Hash table anyone?  They bloat the executable code due to template expansion 17
  18. 18. Qt Containers Designed “the Qt way”  Easy to use, no complex stuff Implicitly shared  You can pass by value without impacting performance (more readable code!) Minimal inline expansion  Generate light executables for embedded code 18
  19. 19. Qt Containers QList<>, QLinkedList<>, QVector<>  QList<> is an array of pointers  Random access  Best for most purpose (very fast operations)  QLinkedList<> is a true linked list of pointers  O(1) insertion in the middle, no random access  QVector<> is an array of objects  Occupy contiguous space in memory  Slow insertions, but cache friendly 19
  20. 20. Qt Containers QVector<> is an array of objects  Occupy contiguous space in memory  Slow insertions, but cache friendly QList<> is an array of pointers  Random access  Best for most purpose (very fast operations) QSet<>  Fast set of objects (no repetition)  Implemented through hash-table (much faster than std::set!) → not ordered 20
  21. 21. Qt Containers QHash<>, QMap<>  Associative arrays (map values to keys)  QHash<> relies on qHash() and operator==(), QMap on operator<()  Hashtables are O(1) for lookups, maps are O(logn)  Iteration: hashtables have random order, maps have fixed order 21
  22. 22. Qt / XML parsers Stream based DOM QXmlReader  QtDom*  SAX2  W3C QXmlStreamReader  Qt specific
  23. 23. QXmlReader SAX2 only http://www.saxproject.org not validating, namespace support SAX2 parsing is callback based  for each sax-event a different function is called the parser has no state
  24. 24. QDom* in memory representation of the XML document follow the W3C recommendations useful to manipulate the XML document not validating, namespace support
  25. 25. QtNetwork Qt module to make networking programs  QtGui not required high-level classes  for http/ftp clients low-level classes  direct access to the underling socket  event driven (= high performance) SSL support
  26. 26. QtNetwork high level classes low level classes QNetworkAccessManager  QTcpServer QFtp  QTcpSocket  QUdpServer  QUdpSocket  QSsl*
  27. 27. QtNetwork QMetworkAccessManager  event driven → the event loop must be running  QNetworkRequest  full support for setting http headers  QNetworkReply  access to the reply headers  signals to track the downloading process
  28. 28. QtNetwork QNetworkDiskCache  simple, disk based, cache  QAbstractNetworkCache for a custom cache QnetworkProxy  route network connections through a proxy  SOCK5, HTTP, HTTP Caching, FTP Caching  transparent to the networking code  application wide / per socket  anonymous or username/password
  29. 29. Any Questions? ? 29
  30. 30. GRAZIE ! Develer S.r.l. Via Mugellese 1/A 50013 Campi Bisenzio Firenze - ItaliaContattiMail: info@develer.comPhone: +39-055-3984627Fax: +39 178 6003614http://www.develer.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×