SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Qt Everywhere: a C++
   abstraction platform




Gianni 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 it's 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
        It's 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: 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
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, 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
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 - Italia




Contatti
Mail: info@develer.com
Phone: +39-055-3984627
Fax: +39 178 6003614
http://www.develer.com

Contenu connexe

Tendances

Java 7 & 8
Java 7 & 8Java 7 & 8
Java 7 & 8
Ken Coenen
 
Clockless design language - ilia greenblat
Clockless design language - ilia greenblatClockless design language - ilia greenblat
Clockless design language - ilia greenblat
chiportal
 
Simple asynchronous remote invocations for distributed real-time Java
Simple asynchronous remote invocations for distributed real-time JavaSimple asynchronous remote invocations for distributed real-time Java
Simple asynchronous remote invocations for distributed real-time Java
Universidad Carlos III de Madrid
 

Tendances (19)

No Heap Remote Objects for Distributed real-time Java
No Heap Remote Objects for Distributed real-time JavaNo Heap Remote Objects for Distributed real-time Java
No Heap Remote Objects for Distributed real-time Java
 
Stackless Python In Eve
Stackless Python In EveStackless Python In Eve
Stackless Python In Eve
 
Reactive Qt - Ivan Čukić (Qt World Summit 2015)
Reactive Qt - Ivan Čukić (Qt World Summit 2015)Reactive Qt - Ivan Čukić (Qt World Summit 2015)
Reactive Qt - Ivan Čukić (Qt World Summit 2015)
 
От Java Threads к лямбдам, Андрей Родионов
От Java Threads к лямбдам, Андрей РодионовОт Java Threads к лямбдам, Андрей Родионов
От Java Threads к лямбдам, Андрей Родионов
 
Yet another introduction to Linux RCU
Yet another introduction to Linux RCUYet another introduction to Linux RCU
Yet another introduction to Linux RCU
 
S emb t13-freertos
S emb t13-freertosS emb t13-freertos
S emb t13-freertos
 
Java 7 & 8
Java 7 & 8Java 7 & 8
Java 7 & 8
 
Clockless design language - ilia greenblat
Clockless design language - ilia greenblatClockless design language - ilia greenblat
Clockless design language - ilia greenblat
 
Enhancing the region model of RTSJ
Enhancing the region model of RTSJEnhancing the region model of RTSJ
Enhancing the region model of RTSJ
 
RCU
RCURCU
RCU
 
Re-engineering Eclipse MDT/OCL for Xtext
Re-engineering Eclipse MDT/OCL for XtextRe-engineering Eclipse MDT/OCL for Xtext
Re-engineering Eclipse MDT/OCL for Xtext
 
NIR on the Mesa i965 backend (FOSDEM 2016)
NIR on the Mesa i965 backend (FOSDEM 2016)NIR on the Mesa i965 backend (FOSDEM 2016)
NIR on the Mesa i965 backend (FOSDEM 2016)
 
Qt for S60
Qt for S60Qt for S60
Qt for S60
 
Simple asynchronous remote invocations for distributed real-time Java
Simple asynchronous remote invocations for distributed real-time JavaSimple asynchronous remote invocations for distributed real-time Java
Simple asynchronous remote invocations for distributed real-time Java
 
FreeRTOS Xilinx Vivado: Hello World!
FreeRTOS Xilinx Vivado: Hello World!FreeRTOS Xilinx Vivado: Hello World!
FreeRTOS Xilinx Vivado: Hello World!
 
Extending ns
Extending nsExtending ns
Extending ns
 
Parallel R
Parallel RParallel R
Parallel R
 
lec9_ref.pdf
lec9_ref.pdflec9_ref.pdf
lec9_ref.pdf
 
Open cl programming using python syntax
Open cl programming using python syntaxOpen cl programming using python syntax
Open cl programming using python syntax
 

En vedette

En vedette (20)

Embedding Qt
Embedding QtEmbedding Qt
Embedding Qt
 
(2) cpp abstractions abstraction_and_encapsulation
(2) cpp abstractions abstraction_and_encapsulation(2) cpp abstractions abstraction_and_encapsulation
(2) cpp abstractions abstraction_and_encapsulation
 
Cross Platform Qt
Cross Platform QtCross Platform Qt
Cross Platform Qt
 
Developing and Benchmarking Qt applications on Hawkboard with Xgxperf
Developing and Benchmarking Qt applications on Hawkboard with XgxperfDeveloping and Benchmarking Qt applications on Hawkboard with Xgxperf
Developing and Benchmarking Qt applications on Hawkboard with Xgxperf
 
Case Study: Porting Qt for Embedded Linux on Embedded Processors
Case Study: Porting Qt for Embedded Linux on Embedded ProcessorsCase Study: Porting Qt for Embedded Linux on Embedded Processors
Case Study: Porting Qt for Embedded Linux on Embedded Processors
 
Qt5 embedded
Qt5 embeddedQt5 embedded
Qt5 embedded
 
Qt on Real Time Operating Systems
Qt on Real Time Operating SystemsQt on Real Time Operating Systems
Qt on Real Time Operating Systems
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
 
Qt Framework Events Signals Threads
Qt Framework Events Signals ThreadsQt Framework Events Signals Threads
Qt Framework Events Signals Threads
 
2CPP14 - Abstraction
2CPP14 - Abstraction2CPP14 - Abstraction
2CPP14 - Abstraction
 
Qt Technical Presentation
Qt Technical PresentationQt Technical Presentation
Qt Technical Presentation
 
QThreads: Are You Using Them Wrong?
QThreads: Are You Using Them Wrong? QThreads: Are You Using Them Wrong?
QThreads: Are You Using Them Wrong?
 
Cutest technology of them all - Forum Nokia Qt Webinar December 2009
Cutest technology of them all - Forum Nokia Qt Webinar December 2009Cutest technology of them all - Forum Nokia Qt Webinar December 2009
Cutest technology of them all - Forum Nokia Qt Webinar December 2009
 
Qt State Machine Framework
Qt State Machine FrameworkQt State Machine Framework
Qt State Machine Framework
 
C++ OOPS Concept
C++ OOPS ConceptC++ OOPS Concept
C++ OOPS Concept
 
Qt Design Patterns
Qt Design PatternsQt Design Patterns
Qt Design Patterns
 
Encapsulation C++
Encapsulation C++Encapsulation C++
Encapsulation C++
 
OOPS IN C++
OOPS IN C++OOPS IN C++
OOPS IN C++
 
Qt Licensing Explained
Qt Licensing ExplainedQt Licensing Explained
Qt Licensing Explained
 
Optimizing Performance in Qt-Based Applications
Optimizing Performance in Qt-Based ApplicationsOptimizing Performance in Qt-Based Applications
Optimizing Performance in Qt-Based Applications
 

Similaire à Qt everywhere a c++ abstraction platform

Os Reindersfinal
Os ReindersfinalOs Reindersfinal
Os Reindersfinal
oscon2007
 
Os Reindersfinal
Os ReindersfinalOs Reindersfinal
Os Reindersfinal
oscon2007
 
Stackless Python In Eve
Stackless Python In EveStackless Python In Eve
Stackless Python In Eve
l xf
 

Similaire à Qt everywhere a c++ abstraction platform (20)

Porting a Streaming Pipeline from Scala to Rust
Porting a Streaming Pipeline from Scala to RustPorting a Streaming Pipeline from Scala to Rust
Porting a Streaming Pipeline from Scala to Rust
 
Qt for beginners part 1 overview and key concepts
Qt for beginners part 1   overview and key conceptsQt for beginners part 1   overview and key concepts
Qt for beginners part 1 overview and key concepts
 
Os Reindersfinal
Os ReindersfinalOs Reindersfinal
Os Reindersfinal
 
Os Reindersfinal
Os ReindersfinalOs Reindersfinal
Os Reindersfinal
 
Clojure ♥ cassandra
Clojure ♥ cassandra Clojure ♥ cassandra
Clojure ♥ cassandra
 
Postgres clusters
Postgres clustersPostgres clusters
Postgres clusters
 
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
 
Qt Internationalization
Qt InternationalizationQt Internationalization
Qt Internationalization
 
Cassandra Java APIs Old and New – A Comparison
Cassandra Java APIs Old and New – A ComparisonCassandra Java APIs Old and New – A Comparison
Cassandra Java APIs Old and New – A Comparison
 
Qt Application Programming with C++ - Part 2
Qt Application Programming with C++ - Part 2Qt Application Programming with C++ - Part 2
Qt Application Programming with C++ - Part 2
 
NET Systems Programming Learned the Hard Way.pptx
NET Systems Programming Learned the Hard Way.pptxNET Systems Programming Learned the Hard Way.pptx
NET Systems Programming Learned the Hard Way.pptx
 
The Ring programming language version 1.3 book - Part 53 of 88
The Ring programming language version 1.3 book - Part 53 of 88The Ring programming language version 1.3 book - Part 53 of 88
The Ring programming language version 1.3 book - Part 53 of 88
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
 
Kubernetes @ Squarespace: Kubernetes in the Datacenter
Kubernetes @ Squarespace: Kubernetes in the DatacenterKubernetes @ Squarespace: Kubernetes in the Datacenter
Kubernetes @ Squarespace: Kubernetes in the Datacenter
 
Kubernetes @ Squarespace (SRE Portland Meetup October 2017)
Kubernetes @ Squarespace (SRE Portland Meetup October 2017)Kubernetes @ Squarespace (SRE Portland Meetup October 2017)
Kubernetes @ Squarespace (SRE Portland Meetup October 2017)
 
Akka-demy (a.k.a. How to build stateful distributed systems) I/II
 Akka-demy (a.k.a. How to build stateful distributed systems) I/II Akka-demy (a.k.a. How to build stateful distributed systems) I/II
Akka-demy (a.k.a. How to build stateful distributed systems) I/II
 
Real-time Programming in Java
Real-time Programming in JavaReal-time Programming in Java
Real-time Programming in Java
 
Netflix at-disney-09-26-2014
Netflix at-disney-09-26-2014Netflix at-disney-09-26-2014
Netflix at-disney-09-26-2014
 
LibOS as a regression test framework for Linux networking #netdev1.1
LibOS as a regression test framework for Linux networking #netdev1.1LibOS as a regression test framework for Linux networking #netdev1.1
LibOS as a regression test framework for Linux networking #netdev1.1
 
Stackless Python In Eve
Stackless Python In EveStackless Python In Eve
Stackless Python In Eve
 

Plus de Develer S.r.l.

Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linuxTrace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Develer S.r.l.
 
Cloud computing, in practice ~ develer workshop
Cloud computing, in practice ~ develer workshopCloud computing, in practice ~ develer workshop
Cloud computing, in practice ~ develer workshop
Develer S.r.l.
 

Plus de Develer S.r.l. (19)

Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linuxTrace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
Trace32 lo-strumento-piu-completo-per-il-debug-di-un-sistema-linux
 
Sw libero rf
Sw libero rfSw libero rf
Sw libero rf
 
Engagement small
Engagement smallEngagement small
Engagement small
 
Farepipi
FarepipiFarepipi
Farepipi
 
Cloud computing, in practice ~ develer workshop
Cloud computing, in practice ~ develer workshopCloud computing, in practice ~ develer workshop
Cloud computing, in practice ~ develer workshop
 
Workshop su Android Kernel Hacking
Workshop su Android Kernel HackingWorkshop su Android Kernel Hacking
Workshop su Android Kernel Hacking
 
BeRTOS Embedded Survey Summary 2011
BeRTOS Embedded Survey Summary 2011BeRTOS Embedded Survey Summary 2011
BeRTOS Embedded Survey Summary 2011
 
Qt roadmap: the future of Qt
Qt roadmap: the future of QtQt roadmap: the future of Qt
Qt roadmap: the future of Qt
 
Qt Quick for dynamic UI development
Qt Quick for dynamic UI developmentQt Quick for dynamic UI development
Qt Quick for dynamic UI development
 
Qt licensing: making the right choice
Qt licensing: making the right choiceQt licensing: making the right choice
Qt licensing: making the right choice
 
Qt Creator: the secret weapon of any c++ programmer
Qt Creator: the secret weapon of any c++ programmerQt Creator: the secret weapon of any c++ programmer
Qt Creator: the secret weapon of any c++ programmer
 
PyQt: rapid application development
PyQt: rapid application developmentPyQt: rapid application development
PyQt: rapid application development
 
Hybrid development using Qt webkit
Hybrid development using Qt webkitHybrid development using Qt webkit
Hybrid development using Qt webkit
 
Smashing the bottleneck: Qt application profiling
Smashing the bottleneck: Qt application profilingSmashing the bottleneck: Qt application profiling
Smashing the bottleneck: Qt application profiling
 
BeRTOS: Sistema Real Time Embedded Free
BeRTOS: Sistema Real Time Embedded FreeBeRTOS: Sistema Real Time Embedded Free
BeRTOS: Sistema Real Time Embedded Free
 
BeRTOS: Free Embedded RTOS
BeRTOS: Free Embedded RTOSBeRTOS: Free Embedded RTOS
BeRTOS: Free Embedded RTOS
 
Develer - Company Profile
Develer - Company ProfileDeveler - Company Profile
Develer - Company Profile
 
Bettersoftware Feedback 2009
Bettersoftware Feedback 2009Bettersoftware Feedback 2009
Bettersoftware Feedback 2009
 
Develer - Qt Embedded - Introduzione
Develer - Qt Embedded - Introduzione Develer - Qt Embedded - Introduzione
Develer - Qt Embedded - Introduzione
 

Dernier

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Dernier (20)

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

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
  • 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
  • 30. GRAZIE ! Develer S.r.l. Via Mugellese 1/A 50013 Campi Bisenzio Firenze - Italia Contatti Mail: info@develer.com Phone: +39-055-3984627 Fax: +39 178 6003614 http://www.develer.com