Qt: Information einem Signal mitgeben



  • Hey,
    kann man eigentlich einem Signal eine "Information" mitgeben?
    Einfaches Beispiel mit einer logischen Funktion. Klasse MainWin ist "parent von"(sagt man das so?) Klasse Child. Wenn in MainWin bool CHECK() aufgerufen wird, soll in Child bool check() aufgerufen werden. In Child wird nun zb ein Integer geprüft, ob er 0 ist, das Ergebnis ist dann false, andernfalls true. Kann ich in MainWin irgendwie den Rückgabewert von check() unmittelbar durch den Aufruf CHECK() einsehen lassen?
    Man könnte ja check() bei true einfach ein anderes Signal emittieren lassen, doch dann müsste ich ja irgendwas konstruieren, damit das Programm auf das Signal wartet und das ist ja iwie dumm...

    Selbe FRage nochmal auf ne andere Anwendung bezogen:
    Kenn ich ein Signal einen Wert übermitteln lassen, sodass die Slot-Funktion ihn verarbeiten kann?



  • Ich versteh nicht was du sagen willst und finde deine Ausführungen auch etwas wirr.
    Ein Signal kann Parameter haben. Damit könnte man deinen Betreff sofort bejahen. Aber so wie ich das verstanden habe, willst du eher, dass Slots einen Wert zurückgeben? Das geht nicht, allein schon wegen Sachen wie Queued Connection. Aber du kannst natürlich out Parameter konstruieren, wo der Slot was reinschreibt.



  • Nein, das geht nicht, außer natürlich durch Konstruktionen die prinzipiell identisch zum nutzen von signalen und slots ist.
    Du könntest z.B. eine membervariable erstellen und die referenz darauf an deine parentklasse schicken. Dann kann die das direkt einsehen.
    Ist aber eigentlich sinnlos und eine "rückleitung" mit einem weiteren signal sinnvoller.



  • Bei dem obigen Beispiel würde ich sagen, SIGNAL/SLOT ist überflüssig.

    Wenn in MainWin bool CHECK() aufgerufen wird, soll in Child bool check() aufgerufen werden.

    bool MainWin::CHECK()
    {
        [...]
        bool child_ret = child_->check();
        [...]
        return irgend_was;
    }
    

    Ansonsten:
    Konkretes Problem beschreiben (und nicht irgend welche "ähnlichen" Problembeispiele), dann kann man auch eine konkrete Lösung anbieten.



  • Ja stimmt, bei der "Check()-Sache" kann mans so machen.
    So jetzt ein "konkretes Beispiel": (Code ist zu lang für original)

    class Master
    {
    private:
        Calculater *c;
        Data *d;
    public:
        Master()
       {
           c=new Calculater;
           d=new Data(c);
       };
        void calc()
        {
            for(long i;i<10000000;++i)
            {
                c->calculate(i);
                d->save();
            }
        }
    };
    
    class Calculater
    {
    public:
       Calculater(){};
       calculate( int X)
       {//do sth};
    };
    
    class Data
    {
    public:
        save()
        {//do sth};
        Data(Calculater *c){//sth};
    };
    

    Kurze Sinn Erklärung:
    calculate() berechnet eine interne(Calculater) Variable, die dann durch save() in einem internen(Data) Array,oä, gespeichert wird.
    Würde ja erstmal so funktionieren, stellt man sich aber das ganze jetzt in einem QT-Programm vor, würde dieses bei Aufruf von calc() "hängen", wegen der langen Durchlaufszeit. Um den "calc-Prozess" quasi im Hintergrund laufen zu lassen, würde ich jetzt zu Singalen greifen.
    Dazu braucht man 1. ein Signal das die Funktion calculate(int ) aufruft und dabei das Argument überträgt
    und 2. muss die Reihenfolge der Prozessschritte ja eingehalten werden. Also das nicht save() schon aufgerufen wird, wenn calculate(int) noch nicht vollständig abgearbeitet ist.

    Hoffe das war jetzt etwas verständlicher 🙂



  • Wie gesagt, ich seh da kein Problem. Signale können ganz einfach Parameter haben:

    signals:
    void calcCompleted(int bla);

    emit calcCompleted(42);

    Und um die Reihenfolge einzuhalten kannst du dann entweder auf den Thread warten, oder du stößt die nächste Berechnung eben durch ein Signal an.



  • Mechanics schrieb:

    signals:
    void calcCompleted(int bla);

    emit calcCompleted(42);

    Und um die Reihenfolge einzuhalten kannst du dann entweder auf den Thread warten, oder du stößt die nächste Berechnung eben durch ein Signal an.

    Wird in dem Beispiel oben int bla auch an die Slotfunktion weitergegeben werden, wenn die ein Integer Argument erwartet?



  • Du musst halt connecten

    public slots:
    void calc(int bla);

    connect(sender, SIGNAL(calcFinished(int)), receiver, SLOT(calc(int)));

    Ich hab das Gefühl, du hast ganz einfach keine Ahnung von Signals und Slots. Lies dich einfach mal eine halbe Stunde ein, anstatt lauter komische Fragen zu stellen, das bringt doch nichts.


Log in to reply