One very, very, very annoying feature of Qt in C++ is how very difficult it is to create bespoke slots.
With gtkmm, you can more or less get away with using boost::bind so long as the bind results in a 0-ary function (otherwise the signal/slots library for gtkmm is not compatible.)
With Qt, you have to write a new member function, or heaven forbid, a new class. This is too much typing for me. Ideally, what I would like to do is something like:
Doing this with bare Qt, I'd have to:
- Create a new slot function: Foo::bar_special_case
- Add member variables for the variables else,entirely
- Finally use it as: connect(some_button,SIGNAL(clicked(),something,SLOT(bar_special_case()))
After doing this for the 100 billionth time, I realized that there should be a better way to do this. After months of investigation, I have discovered that there is no better way to do this.
The idea is to create a slot handler that accepts boost::function types:
struct SignalHandler0 : QObject
SignalHandler0(QObject * parent,
boost::function<void(void)> const & f):
QObject(parent), // parent will delete this object when destructed
// Cannot throw exceptions from signals.
If I were to use this class directly, I would write:
// Note: Not a leak as button will delete the handler when destructed
That's pretty much it. Of course, this is a bit too verbose so I'd write a free function:
connect(QObject * sender, const char * signal,
const & f)
// Note: Not a leak as sender will delete the handler when destructed
And use it as:::connect(button,SLOT(clicked()),boost::bind(&Foo::bar,something,else,entirely))
The obvious problem with this approach is if you add any overload of the free function + bind and you are in for some fun. I prototyped a solution for this based on the Boost.FunctionTypes library but at the moment, I don't need this (i.e., I am happy with 0-ary bind)
Another thing... Why does the aforementioned function types library not handle boost function and boost bind?
PS: I'm not dead. I just smell funny.
PPS: Sorry for so long in between posts, I've been very busy (the good kind!)