I have an old codebase I started writing using the Qt 3.x framework—a little while before Qt4 was released. It’s still alive! I still work on it, keeping up-to-date with Qt and C++ as much as possible, and I still ship the product. Over the years I have moved the codebase along through Qt4 to Qt5, and on to compilers supporting C++11. One of the things I’ve sometimes found a little excessive is declaring slots for things that are super short and won’t be reused.
Here’s a simplified example from my older code that changes the title when a project is “dirty” (needs to be saved):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/// header class myMainWindow ... private slots: void slotProjectDirtyChanged(); private: void _setTitle( const QString &inTitle ); // implementation ... connect( inProject, SIGNAL( signalDirtyChange( bool ) ), SLOT( slotProjectDirtyChanged() ) ); ... void myMainWindow::slotProjectDirtyChanged() { QString name = mProject->name(); if ( mProject->dirty() ) name += '*'; _setTitle( name ); } |
(Aside: If you are wondering about my naming convention, I developed a style when using Qt early on (c. 2000) where signals are named signalFoo() and slots are named slotFoo(). This way I know at a glance what the intent is. If I’m about to modify a slot function I might take an extra minute to look around since most IDEs can’t tell syntactically where it’s used in a SLOT()
macro. In this case you have to search for it textually.)
Thanks to C++11 lambdas and Qt’s ongoing evolution, these short slots can be replaced by a more succinct syntax. This avoids having to declare a method in your class declaration and shortens your implementation code. Both desirable goals!
Let’s take a look.