0
Qt Widgets In-Depth
    QWidget Under The Surface
About Me

• Marius Bugge Monsen
• Qt Developer
• Qt Widgets Team Lead
• Widgets and Window Systems
• Flags and Attributes
• The Future of Qt Widgets
by extranoise on flickr




Widgets and Window Systems
• Widgets and Window Systems
 • Window Systems
 • Windows and Widgets
 • Updates and Painting
 • Events and Loops
• Widgets and Window Systems
 • Window Systems
 • Windows and Widgets
 • Updates and Painting
 • Events and Loops
QWS       SunView
MiniGUI                             Metisse
     Rio    Microwindows
DM                          Fresco/...
• X11
• Desktop Window Manager (MS Windows)
• Quartz Compositor (Mac OS X)
• QWS
• S60 Window Manager
Window Surface
Surface


Surface
Screen
Window System
Window System
Window System         Qt Application


                IPC     #include<QtGui>
                        int main(int argc, ...
• Widgets and Window Systems
 • Window Systems
 • Windows and Widgets
 • Updates and Painting
 • Events and Loops
Surface


          Surface


Surface
Surface


Surface             Surface
Widget


         Window


Widget
Window
• Widgets and Window Systems
 • Window Systems
 • Windows and Widgets
 • Updates and Painting
 • Events and Loops
Window System   Paint    Painting Code
                            #include<QtGui>
                            int main(in...
Window System   Backing Store   Painting Code
                                   #include<QtGui>
                         ...
Text


Text
Text


Text
• Client Side
 • Top-Level Window
   • Backing Store
   • Pixmap
• Server Side
 • Window
 • Pixmap
• Client Side        • Server Side
 • Window             • Window
   • Backing Store    • Pixmap
   • Pixmap
void QWidgetPrivate::drawWidget(QPaintDevice *pdev,
                                     const QRegion &rgn,
             ...
• Widgets and Window Systems
 • Window Systems
 • Windows and Widgets
 • Updates and Painting
 • Events and Loops
• Spontaneous Events
• Application Events
Input   Event   bool W::event(QEvent *e)
                      {

Any                     if (e->type() == t)
            ...
Window System      Socket       Qt Event Dispatcher Event Handler
                                                        ...
int QCoreApplication::exec()
{
   ...
   QEventLoop eventLoop;
   self->d_func()->in_exec = true;
   self->d_func()->about...
int QEventLoop::exec(ProcessEventsFlags flags)
{
   ...
   try {
       while (!d->exit)
         processEvents(flags | Wait...
bool QEventLoop::processEvents(ProcessEventsFlags flags)
{
  Q_D(QEventLoop);
  if (!d->threadData->eventDispatcher)
      ...
bool QEventDispatcherUNIX::processEvents
(QEventLoop::ProcessEventsFlags flags)
{
  ...
  // we are awake, broadcast it
  e...
int QEventDispatcherUNIXPrivate::doSelect(
   QEventLoop::ProcessEventsFlags flags, timeval *timeout)
{
   ...
   // Proces...
int QEventDispatcherUNIX::select(int nfds,
                                     fd_set *readfds,
                         ...
int qt_safe_select(int nfds,
                       fd_set *fdread,
                       fd_set *fdwrite,
              ...
• select()
 • poll status of file descriptors
 • blocks until timeout
X11      Socket       XLib Queue   Qt Event Dispatcher Event Handler
                                                     ...
postEvent()       Qt Event Queue   Event Loop   Event Handler
   #include<Q                                       bool
   ...
sendEvent()       Event Handler
   #include<Q         bool
   tGui>              W::event
   int main(int       (QEvent *e...
• Event Propagation
D

A

    C
        B
D


    C


A       B
D


    C


A       B
D


    C


A       B
D


    C


A       B
bool QApplication::notify(QObject *receiver, QEvent *e)
{
  ...
  bool res = false;
  if (!receiver->isWidgetType()) {
   ...
• Widgets Propagate Events
...
case QEvent::StatusTip:
case QEvent::WhatsThisClicked:
    {
        QWidget *w = static_cast<QWidget *>(receiver);
  ...
• Input Events Are Propagated
• Input Events are propagated if
 • event->isAccepted() == false
 • receiver->event(e) == false
bool QCoreApplicationPrivate::notify_helper(QObject *receiver,
                                            QEvent * event)...
by Dan Queiroz on flickr




Flags and Attributes
• Flags and Attributes
 • Window Types
 • Window Hints
 • Widget States
 • Widget Attributes
• QWidget
 • QPaintDevice
 • QObject
• QWindowSurface
• Flags and Attributes
 • Window Types
 • Window Hints
 • Widget States
 • Widget Attributes
• Window Types
 • Widget
 • Window
•   Dialog

•   Sheet (Mac)

•   Drawer (Mac)

•   Popup

•   ToolTip

•   SplashScreen

•   Desktop

•   SubWindow (MDI)
• Flags and Attributes
 • Window Types
 • Window Hints
 • Widget States
 • Widget Attributes
•   CustomizeWindowHint           •   MacWindowToolBarButtonHint

•   WindowTitleHint               •   BypassGraphicsProx...
• Flags and Attributes
 • Window Types
 • Window Hints
 • Widget States
 • Widget Attributes
• WindowState
 • WindowNoState
 • WindowMinimized
 • WindowMaximized
 • WindowFullScreen
 • WindowActive
• Flags and Attributes
 • Window Types
 • Window Hints
 • Widget States
 • Widget Attributes
• Qt::Widget Attribute
 • 124 Attributes
 • setAttribute()
 • testAttribute()
• Qt::WA_AcceptDrops
• QWidget::setAcceptDrops()
by robclimbing on flickr




Tips and Tricks
• Qt::WA_StaticContents
Exposed
Static Contents




    Exposed
• Qt::WA_NoSystemBackground
• Qt::WA_OpaquePaintEvent
• QWidget::autoFillBackground
• Qt::WA_OpaquePaintEvent
• QWidget::scroll()
 • QWidget::autoFillBackground
 • Qt::WA_OpaquePaintEvent
Concealed




Scrolled




Exposed
• Qt::WA_TranslucentBackground
#include <QtGui>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   QPixmap skin("transparency.png");...
by jeff_c on flickr




The Future of Qt Widgets
• The story of two APIs ...
• QWidget
 • Widget Hierarchy
• QGraphicsItem
 • Scene Graph
• QWidget
 • Alien Widgets
 • Graphics Effects
 • Disable Clipping ?
 • Disable Move Events ?
 • Transformations ?
• Is it possible ?
• Is it possible in Qt 4.x ?
Thank you!

Questions?
Bonus Material
Qt Developer Days
 Window System
Window Surface   Scene Graph   IPC
QSharedMemory QGraphicsScene   QTcpSocket
• Server
• Window
• Server
 • Connections
 • Scene Graph
• Window
 • Surface
 • Geometry
 • Id
Server       Client

         #include<QtGui>
         int main(int argc, char *argv[])
         {
           QApplication...
Server   Protocol       Client




           ?
                    #include<QtGui>
                    int main(int argc,...
• Message
 • Request
 • Reply
 • Event
Request    #include<QtGui>
           int main(int argc, char
           *argv[])
           {
             QApplication a...
Event   bool W::event(QEvent *e)
        {
          if (e->type() == t)
              foobar();
          return false;
 ...
Lighthouse
• Research!
• Qt Graphicssystem Interface
• Makes Qt ports easy
• QGraphicsSystem
• QGraphicsSystemScreen
• QWindowSurface
• QGraphicsSystem
 • Window Surfaces
 • Server Communication
• QGraphicsSystemScreen
 • Screen Information
   • Depth
   • Resolution
   • Size
• QWindowSurface
 • Surface
 • Geometry
 • Id
Demo
Source Code


•   git://gitorious.org/+qt-developers/qt/lighthouse.git
Qt Widget In-Depth
Qt Widget In-Depth
Qt Widget In-Depth
Qt Widget In-Depth
Upcoming SlideShare
Loading in...5
×

Qt Widget In-Depth

11,614

Published on

Everything you want to know about QWidget, but were afraid to ask. QWidget is the base-class for all Qt's user interface objects. This talk will take an in-depth look at how QWidget works internally and how it interacts with the native windowing system.

Presentation by Marius Bugge Monsen held during Qt Developer Days 2009.

http://qt.nokia.com/developer/learning/elearning

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

No Downloads
Views
Total Views
11,614
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
343
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "Qt Widget In-Depth"

  1. 1. Qt Widgets In-Depth QWidget Under The Surface
  2. 2. About Me • Marius Bugge Monsen • Qt Developer • Qt Widgets Team Lead
  3. 3. • Widgets and Window Systems • Flags and Attributes • The Future of Qt Widgets
  4. 4. by extranoise on flickr Widgets and Window Systems
  5. 5. • Widgets and Window Systems • Window Systems • Windows and Widgets • Updates and Painting • Events and Loops
  6. 6. • Widgets and Window Systems • Window Systems • Windows and Widgets • Updates and Painting • Events and Loops
  7. 7. QWS SunView MiniGUI Metisse Rio Microwindows DM Fresco/Berlin 8 1/2 GEM ManaGeR HP Windows OOHG Xynth MicroXwin Intuition Y FBUI NeWS NeXT DPS Quartz Wayland Twin OPIE X
  8. 8. • X11 • Desktop Window Manager (MS Windows) • Quartz Compositor (Mac OS X) • QWS • S60 Window Manager
  9. 9. Window Surface
  10. 10. Surface Surface
  11. 11. Screen
  12. 12. Window System
  13. 13. Window System
  14. 14. Window System Qt Application IPC #include<QtGui> int main(int argc, char *argv[]) { QApplication a(argc,argv); QWidget w; w.show(); return a.exec(); }
  15. 15. • Widgets and Window Systems • Window Systems • Windows and Widgets • Updates and Painting • Events and Loops
  16. 16. Surface Surface Surface
  17. 17. Surface Surface Surface
  18. 18. Widget Window Widget
  19. 19. Window
  20. 20. • Widgets and Window Systems • Window Systems • Windows and Widgets • Updates and Painting • Events and Loops
  21. 21. Window System Paint Painting Code #include<QtGui> int main(int argc, char *argv[]) { QApplication a (argc,argv); QWidget w; w.show(); return a.exec(); } Update
  22. 22. Window System Backing Store Painting Code #include<QtGui> int main(int argc, char *argv[]) { QApplication a (argc,argv); QWidget w; w.show(); return a.exec(); }
  23. 23. Text Text
  24. 24. Text Text
  25. 25. • Client Side • Top-Level Window • Backing Store • Pixmap
  26. 26. • Server Side • Window • Pixmap
  27. 27. • Client Side • Server Side • Window • Window • Backing Store • Pixmap • Pixmap
  28. 28. void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QPoint &offset, int flags, QPainter *sharedPainter, QWidgetBackingStore *backingStore) { ... //actually send the paint event QPaintEvent e(toBePainted); QCoreApplication::sendSpontaneousEvent(q, &e); ... }
  29. 29. • Widgets and Window Systems • Window Systems • Windows and Widgets • Updates and Painting • Events and Loops
  30. 30. • Spontaneous Events • Application Events
  31. 31. Input Event bool W::event(QEvent *e) { Any if (e->type() == t) foobar(); return false; }
  32. 32. Window System Socket Qt Event Dispatcher Event Handler bool W::event (QEvent *e) { if (e- >type() == Qt Event Loop
  33. 33. int QCoreApplication::exec() { ... QEventLoop eventLoop; self->d_func()->in_exec = true; self->d_func()->aboutToQuitEmitted = false; int returnCode = eventLoop.exec(); ... }
  34. 34. int QEventLoop::exec(ProcessEventsFlags flags) { ... try { while (!d->exit) processEvents(flags | WaitForMoreEvents | EventLoopExec); } catch (...) { ... --d->threadData->loopLevel; return d->returnCode; }
  35. 35. bool QEventLoop::processEvents(ProcessEventsFlags flags) { Q_D(QEventLoop); if (!d->threadData->eventDispatcher) return false; if (flags & DeferredDeletion) QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); return d->threadData->eventDispatcher->processEvents(flags); }
  36. 36. bool QEventDispatcherUNIX::processEvents (QEventLoop::ProcessEventsFlags flags) { ... // we are awake, broadcast it emit awake(); QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData); ... nevents = d->doSelect(flags, tm); ... }
  37. 37. int QEventDispatcherUNIXPrivate::doSelect( QEventLoop::ProcessEventsFlags flags, timeval *timeout) { ... // Process timers and socket notifiers - the common UNIX stuff ... nsel = q->select(highest + 1, &sn_vec[0].select_fds, &sn_vec[1].select_fds, &sn_vec[2].select_fds, timeout); ... }
  38. 38. int QEventDispatcherUNIX::select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, timeval *timeout) { return qt_safe_select(nfds, readfds, writefds, exceptfds, timeout); }
  39. 39. int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept, const struct timeval *orig_timeout) { ... // loop and recalculate the timeout as needed int ret; forever { ret = ::select(nfds, fdread, fdwrite, fdexcept, &timeout); if (ret != -1 || errno != EINTR) return ret; // recalculate the timeout ... } }
  40. 40. • select() • poll status of file descriptors • blocks until timeout
  41. 41. X11 Socket XLib Queue Qt Event Dispatcher Event Handler bool W::event (QEvent *e) { if (e- >type() == Qt Event Loop
  42. 42. postEvent() Qt Event Queue Event Loop Event Handler #include<Q bool tGui> W::event int main(int (QEvent *e) argc, char { *argv[]) if (e- { >type() ==
  43. 43. sendEvent() Event Handler #include<Q bool tGui> W::event int main(int (QEvent *e) argc, char { *argv[]) if (e- { >type() ==
  44. 44. • Event Propagation
  45. 45. D A C B
  46. 46. D C A B
  47. 47. D C A B
  48. 48. D C A B
  49. 49. D C A B
  50. 50. bool QApplication::notify(QObject *receiver, QEvent *e) { ... bool res = false; if (!receiver->isWidgetType()) { res = d->notify_helper(receiver, e); } else switch (e->type()) { ... }
  51. 51. • Widgets Propagate Events
  52. 52. ... case QEvent::StatusTip: case QEvent::WhatsThisClicked: { QWidget *w = static_cast<QWidget *>(receiver); while (w) { res = d->notify_helper(w, e); if ((res && e->isAccepted()) || w->isWindow()) break; w = w->parentWidget(); } } break; ...
  53. 53. • Input Events Are Propagated
  54. 54. • Input Events are propagated if • event->isAccepted() == false • receiver->event(e) == false
  55. 55. bool QCoreApplicationPrivate::notify_helper(QObject *receiver, QEvent * event) { // send to all application event filters if (sendThroughApplicationEventFilters(receiver, event)) return true; // send to all receiver event filters if (sendThroughObjectEventFilters(receiver, event)) return true; // deliver the event return receiver->event(event); }
  56. 56. by Dan Queiroz on flickr Flags and Attributes
  57. 57. • Flags and Attributes • Window Types • Window Hints • Widget States • Widget Attributes
  58. 58. • QWidget • QPaintDevice • QObject • QWindowSurface
  59. 59. • Flags and Attributes • Window Types • Window Hints • Widget States • Widget Attributes
  60. 60. • Window Types • Widget • Window
  61. 61. • Dialog • Sheet (Mac) • Drawer (Mac) • Popup • ToolTip • SplashScreen • Desktop • SubWindow (MDI)
  62. 62. • Flags and Attributes • Window Types • Window Hints • Widget States • Widget Attributes
  63. 63. • CustomizeWindowHint • MacWindowToolBarButtonHint • WindowTitleHint • BypassGraphicsProxyWidget • WindowSystemMenuHint • WindowShadeButtonHint • WindowMinimizeButtonHint • WindowStaysOnTopHint • WindowMaximizeButtonHint • WindowStaysOnBottomHint • WindowMinMaxButtonHint • WindowOkButtonHint (WinCE) • WindowCloseButtonHint • WindowCancelButtonHint (WinCE) • WindowContextHelpButtonHint
  64. 64. • Flags and Attributes • Window Types • Window Hints • Widget States • Widget Attributes
  65. 65. • WindowState • WindowNoState • WindowMinimized • WindowMaximized • WindowFullScreen • WindowActive
  66. 66. • Flags and Attributes • Window Types • Window Hints • Widget States • Widget Attributes
  67. 67. • Qt::Widget Attribute • 124 Attributes • setAttribute() • testAttribute()
  68. 68. • Qt::WA_AcceptDrops • QWidget::setAcceptDrops()
  69. 69. by robclimbing on flickr Tips and Tricks
  70. 70. • Qt::WA_StaticContents
  71. 71. Exposed Static Contents Exposed
  72. 72. • Qt::WA_NoSystemBackground
  73. 73. • Qt::WA_OpaquePaintEvent
  74. 74. • QWidget::autoFillBackground • Qt::WA_OpaquePaintEvent
  75. 75. • QWidget::scroll() • QWidget::autoFillBackground • Qt::WA_OpaquePaintEvent
  76. 76. Concealed Scrolled Exposed
  77. 77. • Qt::WA_TranslucentBackground
  78. 78. #include <QtGui> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPixmap skin("transparency.png"); QLabel widget; widget.setPixmap(skin); widget.setWindowFlags(Qt::Window |Qt::CustomizeWindowHint |Qt::FramelessWindowHint); widget.setAttribute(Qt::WA_TranslucentBackground); widget.resize(skin.size()); widget.show(); return app.exec(); }
  79. 79. by jeff_c on flickr The Future of Qt Widgets
  80. 80. • The story of two APIs ...
  81. 81. • QWidget • Widget Hierarchy • QGraphicsItem • Scene Graph
  82. 82. • QWidget • Alien Widgets • Graphics Effects • Disable Clipping ? • Disable Move Events ? • Transformations ?
  83. 83. • Is it possible ?
  84. 84. • Is it possible in Qt 4.x ?
  85. 85. Thank you! Questions?
  86. 86. Bonus Material
  87. 87. Qt Developer Days Window System
  88. 88. Window Surface Scene Graph IPC
  89. 89. QSharedMemory QGraphicsScene QTcpSocket
  90. 90. • Server • Window
  91. 91. • Server • Connections • Scene Graph
  92. 92. • Window • Surface • Geometry • Id
  93. 93. Server Client #include<QtGui> int main(int argc, char *argv[]) { QApplication a(argc,argv); QWidget w; w.show(); return a.exec(); }
  94. 94. Server Protocol Client ? #include<QtGui> int main(int argc, char *argv[]) { QApplication a(argc,argv); QWidget w; w.show(); return a.exec(); }
  95. 95. • Message • Request • Reply • Event
  96. 96. Request #include<QtGui> int main(int argc, char *argv[]) { QApplication a (argc,argv); QWidget w; w.show(); return a.exec(); } Response #include<QtGui> int main(int argc, char *argv[]) { QApplication a (argc,argv); QWidget w; w.show(); return a.exec(); }
  97. 97. Event bool W::event(QEvent *e) { if (e->type() == t) foobar(); return false; }
  98. 98. Lighthouse
  99. 99. • Research! • Qt Graphicssystem Interface • Makes Qt ports easy
  100. 100. • QGraphicsSystem • QGraphicsSystemScreen • QWindowSurface
  101. 101. • QGraphicsSystem • Window Surfaces • Server Communication
  102. 102. • QGraphicsSystemScreen • Screen Information • Depth • Resolution • Size
  103. 103. • QWindowSurface • Surface • Geometry • Id
  104. 104. Demo
  105. 105. Source Code • git://gitorious.org/+qt-developers/qt/lighthouse.git
  1. A particular slide catching your eye?

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

×