Qt everywhere a c++ abstraction platform

  • 1,018 views
Uploaded on

 

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,018
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
15
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Qt Everywhere: a C++ abstraction platformGianni Valdambrini (aleister@develer.com)
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Qt / XML parsers Stream based DOM QXmlReader  QtDom*  SAX2  W3C QXmlStreamReader  Qt specific
  • 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. QDom* in memory representation of the XML document follow the W3C recommendations useful to manipulate the XML document not validating, namespace support
  • 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. QtNetwork high level classes low level classes QNetworkAccessManager  QTcpServer QFtp  QTcpSocket  QUdpServer  QUdpSocket  QSsl*
  • 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. 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. Any Questions? ? 29
  • 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