Whither (many) examples?
-
2-3 years ago or so, it seems a war of attrition was waged in the
examples
subdir ofqtbase
. There have been a few outright removals, but the primary form this takes is an innocuous-sounding commit message reading, "Move so-and-so example to manual test".While that may sound like just a reorganization, what isn't immediately apparent is that any example so moved is no longer included in the Qt distribution. Which I think is a shame.
And when I say there's been a lot of this, I mean that this is the result of running
git log --oneline 'HEAD@{2 years ago}' examples/widgets/
inside qtbase:$ git log --oneline 'HEAD@{2 years ago}' examples/widgets/ f6e7fdd4ad8 Refurbish the shaped clock example 619ec1a6406 Refurbish the clock example 7c59c5ed13d Examples: remove OpenGL code paths from painting examples ae39b163455 Convert tooltips example to snippets 1fd1ffd03d6 standarddialogs: Don't assume QMessageBox::exec() returns clicked role 4e8b54eb811 Preparations to deprecate QItemDelegate 9de4133da29 Move Calendar Widget Example to UI Components category c3171938c3e Doc: Fix typo in examplecategory command c46551e2033 Doc: Fix documentation issues 7ef93cbf688 Doc: Add example categories to Qt Widget examples 381612f7944 Image Gestures Example: use QFileInfo for images file names f6e7fdd4ad8 Refurbish the shaped clock example 619ec1a6406 Refurbish the clock example 7c59c5ed13d Examples: remove OpenGL code paths from painting examples ae39b163455 Convert tooltips example to snippets 1fd1ffd03d6 standarddialogs: Don't assume QMessageBox::exec() returns clicked ro le 4e8b54eb811 Preparations to deprecate QItemDelegate 9de4133da29 Move Calendar Widget Example to UI Components category c3171938c3e Doc: Fix typo in examplecategory command c46551e2033 Doc: Fix documentation issues 7ef93cbf688 Doc: Add example categories to Qt Widget examples 381612f7944 Image Gestures Example: use QFileInfo for images file names 80520c2f52a Enable QWidget::grab() with QRhiWidget in the widget tree 0b3390f33d4 examples/: fix compiler (GCC) warnings -Wsign-compare d48831612a3 examples: Add new subdirectory to examples/widgets CMakeLists 72a453c6a8b Add QRhiWidget 95ed8d1fd9c Fix the project name 631cb589bf5 Doc fix: Use correct initials for Porter and Duff 60f706063ae Doc: Update example category names d2db1d511dd Remove references to Application Example 3040eadd832 Doc: Fix license of foreignwindows example 72a153a7f57 Move simple widget mapper example to manual test 8937169c190 Move simple dom model example to manual test 9c71b924304 Move plug and paint example to manual test 921337f98c5 Move pixelator example to manual test 5654fbffd58 Move dials example to manual test 81db1766dd0 Move textedit example to manual test 40dbee13ebf Move tetrix example to manual test 89b463ac2fa Move styles example to manual test 1e954f9be89 Move stylesheets example to manual test c5ee7c8b8f2 Move main window example to manual test 4b79834e1a8 Move MDI example to manual test cd7995de573 Move windowcontainer example to manual test 604b2feca75 Modernize EditableTreeModel 25027444a9b Modernize SimpleTreeModel example ec01f6ae8b2 Move movie example to manual test c7702638f33 Move pinch zoom example to manual test e00d8aa6a83 Move validators example to manual test a18c55e7380 Move item views puzzle example to manual test 645e011d7dd Move interview example to manual test b8f588bea74 Move image viewer example to manual test c3fd8e911ea Move icons example to manual test 95595d68bee Move graphis view flow layout example to manual test 532e1c9bf67 Move fridge magnets example to manual test 917282ea536 Move font sampler example to manual test 0b6f5ae131a Move finger paint example to manual test 9a320b037ce Move fade effect example to manual test 7b4b5c839ba Move embedded dialogs example to manual test 76ba4a04223 Move dynamic layouts example to manual test cefb1c9ca9a Move drag and drop puzzle example to manual test 35063254fdb Fix missing references to 'Qt Widgets - Application Example' 71f156fff07 Fix qdoc link warnings after moving a few examples to manual tests 2a65849e10e Move dock widgets example to manual test fc0e82f58a8 Move dirview example to manual test 65e7303ec90 Move digital clock example to manual test e46fb69a87c Move chart example to manual test 3a8265a4290 Move character map example to manual test 288c7ef5570 Move calendar example to manual test 42b58f8cb41 Move border layout example to manual test 7022d0e2236 Replace QDialog::exec() with open() in text edit example 3ccf2f8308b Examples: "About &Qt" should show info about Qt, not quit b908c5cf289 Move scroller/graphicsview example into tests/manual a89f575be3a Move storageview example into tests/manual ce13dc8c2f7 Remove flattreeview example fc9aae544be Dialogs example: add checkbox for ColorDialogOption::NoEyeDropperButton 17ddf2a6a52 Doc: Fix documentation issues eed17b3634a Examples: Remove unnecessary Q_INIT_RESOURCE calls a3dde7c93eb Move widgets blurpicker example to manual test eda71105ff9 Move widgets Application example to manual tests 2a90efcfc2c Diagram Scene: Fix documentation word repetiton fda4da6df96 shortcuteditor example: Don't reference null-action b7c15f7f24c Remove the "classwizard" example 11da92ba945 Convert "extension" dialog example into snippets 8e94af2ed05 Revamp the shapedclock example
As a result, the widgets example directory that used to look like this in the Qt 5.15.2 distribution (still does, technically, I suppose):
$ cd ~/Qt/Examples; tree -d -L 3 Qt-5.15.2/widgets Qt-5.15.2/widgets/ ├── animation │ ├── animatedtiles │ │ └── images │ ├── easing │ │ └── images │ ├── moveblocks │ ├── states │ ├── stickman │ │ └── animations │ └── sub-attaq │ └── pics ├── desktop │ ├── screenshot │ └── systray │ ├── doc │ └── images ├── dialogs │ ├── classwizard │ │ └── images │ ├── extension │ ├── findfiles │ ├── licensewizard │ │ └── images │ ├── standarddialogs │ ├── tabdialog │ └── trivialwizard ├── doc │ ├── images │ └── src ├── draganddrop │ ├── draggableicons │ │ └── images │ ├── draggabletext │ ├── dropsite │ ├── fridgemagnets │ └── puzzle ├── effects │ ├── blurpicker │ │ └── images │ └── fademessage ├── gallery ├── gestures │ └── imagegestures │ └── doc ├── graphicsview │ ├── anchorlayout │ ├── basicgraphicslayouts │ │ └── images │ ├── boxes │ │ └── 3rdparty │ ├── chip │ ├── collidingmice │ │ └── images │ ├── diagramscene │ │ └── images │ ├── dragdroprobot │ │ └── images │ ├── elasticnodes │ ├── embeddeddialogs │ ├── flowlayout │ ├── padnavigator │ │ └── images │ ├── simpleanchorlayout │ └── weatheranchorlayout │ └── images ├── itemviews │ ├── addressbook │ ├── basicsortfiltermodel │ ├── chart │ ├── coloreditorfactory │ ├── combowidgetmapper │ ├── customsortfiltermodel │ │ └── images │ ├── dirview │ ├── editabletreemodel │ ├── fetchmore │ ├── flattreeview │ ├── frozencolumn │ ├── interview │ │ └── images │ ├── pixelator │ │ └── images │ ├── puzzle │ ├── simpledommodel │ ├── simpletreemodel │ ├── simplewidgetmapper │ ├── spinboxdelegate │ ├── spreadsheet │ │ └── images │ ├── stardelegate │ └── storageview ├── layouts │ ├── basiclayouts │ ├── borderlayout │ ├── dynamiclayouts │ └── flowlayout ├── mac │ ├── qmaccocoaviewcontainer │ └── qmacnativewidget ├── mainwindows │ ├── application │ │ └── images │ ├── dockwidgets │ │ └── images │ ├── mainwindow │ ├── mdi │ │ └── images │ ├── menus │ └── sdi │ └── images ├── painting │ ├── affine │ ├── basicdrawing │ │ └── images │ ├── composition │ ├── concentriccircles │ ├── deform │ ├── fontsampler │ ├── gradients │ ├── imagecomposition │ │ └── images │ ├── painterpaths │ ├── pathstroke │ ├── shared │ │ └── images │ └── transformations ├── qnx │ └── foreignwindows ├── richtext │ ├── calendar │ ├── orderform │ ├── syntaxhighlighter │ └── textedit │ └── images ├── scroller │ └── graphicsview ├── statemachine │ ├── eventtransitions │ ├── factorial │ ├── pingpong │ ├── rogue │ ├── trafficlight │ └── twowaybutton ├── tools │ ├── codecs │ │ ├── doc │ │ ├── encodedfiles │ │ └── images │ ├── completer │ │ └── resources │ ├── customcompleter │ │ ├── doc │ │ └── resources │ ├── echoplugin │ │ ├── echowindow │ │ └── plugin │ ├── i18n │ │ └── translations │ ├── plugandpaint │ │ ├── app │ │ └── plugins │ ├── regexp │ ├── regularexpression │ │ └── images │ ├── settingseditor │ │ └── inifiles │ ├── styleplugin │ │ ├── plugin │ │ └── stylewindow │ ├── treemodelcompleter │ │ └── resources │ ├── undo │ │ └── icons │ └── undoframework │ └── images ├── touch │ ├── dials │ │ └── doc │ ├── fingerpaint │ │ └── doc │ ├── knobs │ │ └── doc │ └── pinchzoom │ ├── doc │ └── images ├── tutorials │ ├── addressbook │ │ ├── part1 │ │ ├── part2 │ │ ├── part3 │ │ ├── part4 │ │ ├── part5 │ │ ├── part6 │ │ └── part7 │ ├── gettingStarted │ │ └── gsQt │ ├── modelview │ │ ├── 1_readonly │ │ ├── 2_formatting │ │ ├── 3_changingmodel │ │ ├── 4_headers │ │ ├── 5_edit │ │ ├── 6_treeview │ │ └── 7_selections │ ├── notepad │ │ └── images │ └── widgets │ ├── childwidget │ ├── nestedlayouts │ ├── toplevel │ └── windowlayout ├── widgets │ ├── analogclock │ ├── calculator │ ├── calendarwidget │ ├── charactermap │ ├── codeeditor │ ├── digitalclock │ ├── elidedlabel │ ├── groupbox │ ├── icons │ │ └── images │ ├── imageviewer │ ├── lineedits │ ├── mousebuttons │ ├── movie │ ├── scribble │ ├── shapedclock │ ├── sliders │ ├── spinboxes │ ├── styles │ │ └── images │ ├── stylesheet │ │ ├── images │ │ ├── layouts │ │ └── qss │ ├── tablet │ │ └── images │ ├── tetrix │ ├── tooltips │ │ └── images │ ├── validators │ ├── wiggly │ └── windowflags └── windowcontainer 246 directories
And like this in Qt 6.2.4:
$ cd ~/Qt/Examples; tree -d -L 3 Qt-6.2.4/widgets Qt-6.2.4/widgets ├── animation │ └── easing │ └── images ├── desktop │ ├── screenshot │ └── systray │ ├── doc │ └── images ├── dialogs │ ├── classwizard │ │ └── images │ ├── extension │ ├── findfiles │ ├── licensewizard │ │ └── images │ ├── standarddialogs │ ├── tabdialog │ └── trivialwizard ├── doc │ ├── images │ └── src ├── draganddrop │ ├── draggableicons │ │ └── images │ ├── draggabletext │ ├── dropsite │ ├── fridgemagnets │ └── puzzle ├── effects │ ├── blurpicker │ │ └── images │ └── fademessage ├── gallery ├── gestures │ └── imagegestures │ └── doc ├── graphicsview │ ├── anchorlayout │ ├── basicgraphicslayouts │ │ └── images │ ├── chip │ ├── collidingmice │ │ └── images │ ├── diagramscene │ │ └── images │ ├── dragdroprobot │ │ └── images │ ├── elasticnodes │ ├── embeddeddialogs │ ├── flowlayout │ ├── simpleanchorlayout │ └── weatheranchorlayout │ └── images ├── itemviews │ ├── addressbook │ ├── basicsortfiltermodel │ ├── chart │ ├── coloreditorfactory │ ├── combowidgetmapper │ ├── customsortfiltermodel │ │ └── images │ ├── dirview │ ├── editabletreemodel │ ├── fetchmore │ ├── flattreeview │ ├── frozencolumn │ ├── interview │ │ └── images │ ├── pixelator │ │ └── images │ ├── puzzle │ ├── simpledommodel │ ├── simpletreemodel │ ├── simplewidgetmapper │ ├── spinboxdelegate │ ├── spreadsheet │ │ └── images │ ├── stardelegate │ └── storageview ├── layouts │ ├── basiclayouts │ ├── borderlayout │ ├── dynamiclayouts │ └── flowlayout ├── mainwindows │ ├── application │ │ └── images │ ├── dockwidgets │ │ └── images │ ├── mainwindow │ ├── mdi │ │ └── images │ ├── menus │ └── sdi │ └── images ├── painting │ ├── affine │ ├── basicdrawing │ │ └── images │ ├── composition │ ├── concentriccircles │ ├── deform │ ├── fontsampler │ ├── gradients │ ├── imagecomposition │ │ └── images │ ├── painterpaths │ ├── pathstroke │ ├── shared │ │ └── images │ └── transformations ├── qnx │ └── foreignwindows ├── richtext │ ├── calendar │ ├── orderform │ ├── syntaxhighlighter │ └── textedit │ └── images ├── scroller │ └── graphicsview ├── tools │ ├── completer │ │ └── resources │ ├── customcompleter │ │ ├── doc │ │ └── resources │ ├── echoplugin │ │ ├── echowindow │ │ └── plugin │ ├── i18n │ │ └── translations │ ├── plugandpaint │ │ ├── app │ │ └── plugins │ ├── regularexpression │ │ └── images │ ├── settingseditor │ │ └── inifiles │ ├── styleplugin │ │ ├── plugin │ │ └── stylewindow │ ├── treemodelcompleter │ │ └── resources │ ├── undo │ │ └── icons │ └── undoframework │ └── images ├── touch │ ├── dials │ │ └── doc │ ├── fingerpaint │ │ └── doc │ ├── knobs │ │ └── doc │ └── pinchzoom │ ├── doc │ └── images ├── tutorials │ ├── addressbook │ │ ├── part1 │ │ ├── part2 │ │ ├── part3 │ │ ├── part4 │ │ ├── part5 │ │ ├── part6 │ │ └── part7 │ ├── gettingStarted │ │ └── gsQt │ ├── modelview │ │ ├── 1_readonly │ │ ├── 2_formatting │ │ ├── 3_changingmodel │ │ ├── 4_headers │ │ ├── 5_edit │ │ ├── 6_treeview │ │ └── 7_selections │ ├── notepad │ │ └── images │ └── widgets │ ├── childwidget │ ├── nestedlayouts │ ├── toplevel │ └── windowlayout ├── widgets │ ├── analogclock │ ├── calculator │ ├── calendarwidget │ ├── charactermap │ ├── codeeditor │ ├── digitalclock │ ├── elidedlabel │ ├── groupbox │ ├── icons │ │ └── images │ ├── imageviewer │ ├── lineedits │ ├── mousebuttons │ ├── movie │ ├── scribble │ ├── shapedclock │ ├── sliders │ ├── spinboxes │ ├── styles │ │ └── images │ ├── stylesheet │ │ ├── images │ │ ├── layouts │ │ └── qss │ ├── tablet │ │ └── images │ ├── tetrix │ ├── tooltips │ │ └── images │ ├── validators │ ├── wiggly │ └── windowflags └── windowcontainer 219 directories
Now looks like this in Qt 6.10.0rc1:
$ cd ~/Qt/Examples; tree -d -L 3 Qt-6.10.0/widgets Qt-6.10.0/widgets ├── animation │ └── easing │ └── images ├── desktop │ ├── screenshot │ └── systray │ ├── doc │ └── images ├── dialogs │ ├── licensewizard │ │ └── images │ ├── standarddialogs │ ├── tabdialog │ └── trivialwizard ├── doc │ ├── images │ └── src ├── draganddrop │ ├── draggableicons │ │ └── images │ ├── draggabletext │ └── dropsite ├── gallery ├── gestures │ └── imagegestures │ └── doc ├── graphicsview │ ├── basicgraphicslayouts │ │ └── images │ ├── chip │ ├── collidingmice │ │ └── images │ ├── diagramscene │ │ └── images │ ├── dragdroprobot │ │ └── images │ ├── elasticnodes │ └── simpleanchorlayout ├── itemviews │ ├── addressbook │ ├── basicsortfiltermodel │ ├── combowidgetmapper │ ├── customsortfiltermodel │ │ └── images │ ├── editabletreemodel │ ├── fetchmore │ ├── frozencolumn │ ├── simpletreemodel │ ├── spreadsheet │ │ └── images │ └── stardelegate ├── layouts │ ├── basiclayouts │ └── flowlayout ├── mainwindows │ └── menus ├── painting │ ├── affine │ ├── basicdrawing │ │ └── images │ ├── composition │ ├── deform │ ├── gradients │ ├── imagecomposition │ │ └── images │ ├── painterpaths │ ├── pathstroke │ ├── shared │ │ └── images │ └── transformations ├── qnx │ └── foreignwindows ├── rhi │ ├── cuberhiwidget │ │ ├── shader_assets │ │ └── shaders │ └── simplerhiwidget │ ├── shader_assets │ └── shaders ├── richtext │ ├── orderform │ └── syntaxhighlighter ├── tools │ ├── completer │ │ └── resources │ ├── customcompleter │ │ ├── doc │ │ └── resources │ ├── regularexpression │ │ └── images │ ├── treemodelcompleter │ │ └── resources │ └── undoframework │ └── icons ├── touch │ └── knobs │ └── doc ├── tutorials │ ├── modelview │ │ ├── 1_readonly │ │ ├── 2_formatting │ │ ├── 3_changingmodel │ │ ├── 4_headers │ │ ├── 5_edit │ │ ├── 6_treeview │ │ └── 7_selections │ ├── notepad │ │ └── images │ └── widgets │ ├── childwidget │ ├── nestedlayouts │ ├── toplevel │ └── windowlayout └── widgets ├── analogclock ├── calculator ├── calendarwidget ├── lineedits ├── scribble ├── shapedclock ├── shortcuteditor ├── sliders ├── spinboxes ├── tablet │ └── images └── windowflags 127 directories
Among the conspicuously absent:
- ALL of the
mainwindow
examples except formenu
- No
application
- No
dockwidgets
- No
mdi
- No
sdi
- No
- Half of the
dialogs
examples - Half of the
draganddrop
examples - 1/3 of the
graphicsview
examples - OVER half of the
itemviews
examples - Half of the
layouts
examples (though that only takes it down from 4 to 2, as that category was always lacking anyway) tools
andtouch
have both been guttedwidgets
is down from 26 examples to 12
Granted, this is offset slightly by other categories that have been shored up. The
quick/
tree went from 238 directories (6.2.4) to 254 directories (6.10.0rc1),quick3d
124 -> 223, andquickcontrols
83 -> 92.wayland/
gained 16 directories, up from 51 to 67, andcorelib/
gained 8 (44->52).linguist/
is up from 8 to 14. Andmultimedia/
went from 43 -> 60, though I assume that's due to it subsuming most or all of the now-absentmultimediawidgets/
tree (previously 21 directories).(I say "directories" instead of "examples" here, because some examples contain asset folders like
doc
,resources
,images
which my recursive directory listing counted separately. In the previous bulleted list, I was careful to count only top-level example directories.)The example-pocalypse is significant, in my view, because every example lost is a Qt feature that users no longer have a complete, working project to learn from and emulate. The "manual test" examples' code being embedded in the API documentation is not, in my mind, the same thing as a complete, working example project.
- ALL of the
-
I bring this up now because I recently discovered that
QDockWidget
floating is completely broken in Linux on Wayland, at least when running under GNOME Shell/Mutter 48. Undocking a dock widget causes it to pop out as a floating frame with no (OS) title bar, and it cannot be dragged to reposition it anywhere else on the screen. (Without using Meta-drag, which is a Mutter keyboard shortcut for "move any window by dragging it from any point inside its boundaries".) The only drags that work without Meta are into theQMainWindow
's dock areas (with no visual feedback from the floating dock), at which point it will re-dock itself. But a non-movable window stretches the definition of "floating" pretty far.This could easily be discovered/confirmed by anyone who builds and runs Qt's example
dockwidgets
project on Linux-Wayland-GNOME, since that example clearly exhibits the broken behavior — if only that code was still distributed as an example!(The Python version is still part of Qt for Python's examples, and is just as broken as the C++ version.)
-
I bring this up now because I recently discovered that
QDockWidget
floating is completely broken in Linux on Wayland, at least when running under GNOME Shell/Mutter 48. Undocking a dock widget causes it to pop out as a floating frame with no (OS) title bar, and it cannot be dragged to reposition it anywhere else on the screen. (Without using Meta-drag, which is a Mutter keyboard shortcut for "move any window by dragging it from any point inside its boundaries".) The only drags that work without Meta are into theQMainWindow
's dock areas (with no visual feedback from the floating dock), at which point it will re-dock itself. But a non-movable window stretches the definition of "floating" pretty far.This could easily be discovered/confirmed by anyone who builds and runs Qt's example
dockwidgets
project on Linux-Wayland-GNOME, since that example clearly exhibits the broken behavior — if only that code was still distributed as an example!(The Python version is still part of Qt for Python's examples, and is just as broken as the C++ version.)
-
I bring this up now because I recently discovered that
QDockWidget
floating is completely broken in Linux on Wayland, at least when running under GNOME Shell/Mutter 48. Undocking a dock widget causes it to pop out as a floating frame with no (OS) title bar, and it cannot be dragged to reposition it anywhere else on the screen. (Without using Meta-drag, which is a Mutter keyboard shortcut for "move any window by dragging it from any point inside its boundaries".) The only drags that work without Meta are into theQMainWindow
's dock areas (with no visual feedback from the floating dock), at which point it will re-dock itself. But a non-movable window stretches the definition of "floating" pretty far.This could easily be discovered/confirmed by anyone who builds and runs Qt's example
dockwidgets
project on Linux-Wayland-GNOME, since that example clearly exhibits the broken behavior — if only that code was still distributed as an example!(The Python version is still part of Qt for Python's examples, and is just as broken as the C++ version.)
@FeRDNYC hi,
This being a user forum you might not reaching the right people.
I would recommend opening a ticket on the bug report system to spark the discussion around the issue of moving the examples.