[Qt-interest] Bug? sender() is always NULL when receiver lives in different QThread from emitter

Tom Panning lurchvt at gmail.com
Mon Jul 6 16:54:45 CEST 2009


This seems to be intentional, since Qt's documentation specifically
describes this behavior. See the second warning at:
http://doc.qtsoftware.com/4.5/qobject.html#sender

Tom

On Mon, Jul 6, 2009 at 10:07 AM, Florian
Vichot<florian.vichot at diateam.net> wrote:
> Hello list and trolls,
>
> I've just spend the morning debugging the weirdest bug, and I finally
> tracked it down to what it says in the title: when calling
> QObject::sender() inside a slot that was called by a signal, the
> receiver QObject has to "live" inside the same QThread as the emitter of
> the signal, otherwise the value of sender() is always NULL.
>
> I fully understand that using Qt::DirectConnection between objects that
> live in different threads is a bad idea, but all I need is
> sender()->objectName(), so that seems safe, especially as I have the
> certainty that sender() won't have been deleted in the mean time.
>
> And anyway, I'd very much like to be able to shoot myself in the foot if
> I feel like it :)
>
> So is it intentional, as some kind of "protection", or is it bug ? From
> my point of view, it's definitely a bug, as I need that sender() pointer
> in my slot, I can't just move my objects around in QThreads all the time
> just to please the metacall mecanism :)
>
> Switched to using QueuedConnection is not really an option, as my object
> could have been deleted in the mean time (my app is very multithreaded).
>
> Below is a very stupid example that reproduces that behaviour. If I
> uncomment the two lines in main(), sender() becomes NULL when printed.
>
> I'm using Ubuntu 9.04, with Qt 4.5.0.
>
> /****************************************/
> // foo.h
> #include <QtCore>
>
> class SlotClass : public QObject
> {
>  Q_OBJECT
>  public slots:
>    void mySlot()
>    {
>      qDebug() << sender();
>    }
> };
>
> class SignalClass : public QObject
> {
>  Q_OBJECT
>  public:
>    void emitSignal() {emit mySignal();}
>
>  signals:
>    void mySignal();
> };
>
> /****************************************/
> // main.cpp
> #include "foo.h"
>
> int main(int argc, char ** argv)
> {
>  QCoreApplication app(argc,argv);
>
>  SlotClass slot;
>  SignalClass sig;
> //  QThread t;
> //  slot.moveToThread(&t);
>
>  QObject::connect(&sig,  SIGNAL(mySignal()),
>                   &slot,   SLOT(mySlot()),
>                   Qt::DirectConnection);
>
>  sig.emitSignal();
>
>  return true;
> }
> /****************************************/
>
> Thanks,
> Florian
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>



More information about the Qt-interest-old mailing list