We had a similar issue with templates, which are somehow C++ macros (just better or worse, depending if you write them or have to understand the ones of another developper....)
One of the solution we had was to define virtual interface for our slots, and then, have our real class derivate from interface and qobject, just redefining the previous virtual functions as slots.
The fun thing is you can do the connect from your interface as it's done on runtime. Kind of risky however to maintain, so we finished by generating these aprts of code with some external python scripting.