Scale your database traffic with Read & Write split using MySQL Router
Qt everywhere a c++ abstraction platform
1. Qt Everywhere: a C++
abstraction platform
Gianni 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 it's 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
It's 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: it's 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, don't use for binary data
QByteArray is better for 8-bit binary data
Contains loads of functionality for any kind of text
processing
11
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
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