Qt everywhere   a c++ abstraction platform
Upcoming SlideShare
Loading in...5
×
 

Qt everywhere a c++ abstraction platform

on

  • 1,245 views

 

Statistics

Views

Total Views
1,245
Views on SlideShare
1,245
Embed Views
0

Actions

Likes
0
Downloads
13
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Qt everywhere   a c++ abstraction platform Qt everywhere a c++ abstraction platform Presentation Transcript

    • 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 access  No network  No multiprocessing/multithreading  No serious unicode support  ... and its not going to change in C++0x! 2
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • Qt / XML parsers Stream based DOM QXmlReader  QtDom*  SAX2  W3C QXmlStreamReader  Qt specific
    • 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
    • QDom* in memory representation of the XML document follow the W3C recommendations useful to manipulate the XML document not validating, namespace support
    • 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
    • QtNetwork high level classes low level classes QNetworkAccessManager  QTcpServer QFtp  QTcpSocket  QUdpServer  QUdpSocket  QSsl*
    • 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
    • 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
    • Any Questions? ? 29
    • 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