Referenz auf eine lokale Variable bei SIGNAL & SLOT



  • Hi,

    ich habe eine Anfängerfrage zur Referenzübergabe von lokalen Variablen bei SIGNAL&SLOT.
    Warum kann ich z.B.

    void Label::mouseMoveEvent(QMouseEvent *Mouse)
    {
    
        QPoint p=Mouse->pos();
    
                if(p.y()>=0 && p.x()>=0)
                {
                    if(p.y()<=(this->size().height())&& p.x()<=(this->size().width()))
                    {
                 emit senderPos(p);
                    }
                }
    
    }
    
    signals:
      void senderPos(QPoint&);
    
    void Widget::receiverPos(QPoint & Pos)
    {
        ui->Text->setText(QString::number(Pos.y())+ " "+QString::number(Pos.x()));
    
    }
    
    connect(ui->Label,SIGNAL(senderPos(QPoint&)),this,SLOT(receiverPos(QPoint&)));
    

    sowas machen 😕 Ich habe mal die Codeteile angegeben ,die sich auf die Verbindung beziehen. Also das Programm funktioniert wunderbar,aber als ich den Code nochmal angeschaut habe, fiel mir auf, dass ich eine Referenz auf eine lokale Variable verwende... Warum funktioniert das Programm trotzdem ?

    Für die jegliche Verständnishilfe möchte ich mich im Vorfeld bedanken.



  • Hallo,

    im Normalfall entspricht ein Aufruf eines Slot nachdem absenden eines Signals einem Methodenaufruf. Dies siehst du auch beim Debugging.

    Folgender Code ist äquivalent (angenommen Empfänger wäre bekannt):

    void Label::mouseMoveEvent(QMouseEvent *Mouse)
    {
      QPoint p=Mouse->pos();
    
      if(p.y()>=0 && p.x()>=0)
      {
        if(p.y()<=(this->size().height())&& p.x()<=(this->size().width()))
        {
          //emit senderPos(p);
          widget->receiverPos(p);
        }
      } 
    }
    

    Daher funktioniert das. 🙂

    Viele Grüße,



  • Das ganze funktioniert aber auch nur solange das signal nicht queued wird.
    Mit queued ist hier gemeint, dass das aussenden des Signals in einem thread passiert (z.b. in einem hintergrund thread) aber der Handler des Signals in einem anderen Thread (z.b. dem Main thread in dem auch der gui code abläuft).

    Siehe auch http://doc.qt.io/qt-5/signalsandslots.html

    Edit: Ich habe gerade das hier gefunden. Scheinbar erzeugt Qt für eine Queued connection kopien der parameter auch wenn der parameter typ eine const reference ist
    Quelle: http://stackoverflow.com/questions/8455887/stack-object-qt-signal-and-parameter-as-reference/29742028#29742028



  • Okay,
    nach der Erklärung von __jb__ komme ich mir einbisschen dumm vor die Frage gestellt zu haben. 🙄
    Aber nochmals Danke für die Klarstellung und auch für den interessanten Link zum anderen Forum.



  • TommytheCat schrieb:

    Okay,
    nach der Erklärung von __jb__ komme ich mir einbisschen dumm vor die Frage gestellt zu haben. 🙄
    Aber nochmals Danke für die Klarstellung und auch für den interessanten Link zum anderen Forum.

    Wer nicht Fragt bleibt dumm. 😉

    Ich wünsche frohe Ostern.

    @firefly: Vielen dank für die Info, das ist mir auch neu.


Anmelden zum Antworten