warum steht das Siganl in der Slot Difinition ?

Verschiedenes zu Qt
Antworten
Igell
Beiträge: 27
Registriert: 11. November 2009 20:36

warum steht das Siganl in der Slot Difinition ?

Beitrag von Igell »

Hallo,

ich habe mir ein Buch zur Erklärung von QT4 gekauft.
Nun ist da aber eine Sache die ich nicht verstehe.

/widget.h

Code: Alles auswählen

#include <QtGui/QWidget>

class Widget : public QObject
{
    Q_OBJECT
private :
        int val;

public://kon,-Destruktor
    Widget();
    ~Widget();
    //get methode
    int value()const;

public slots :
        void setValue(int);
signals :
        void valueChanged(int);
};
/widget.cpp

Code: Alles auswählen

#include "widget.h"


//kon,-Destruktor
Widget::Widget()
{
    val = 0;

}

Widget::~Widget()
{

}


//slots
void Widget::setValue(int v)
{
    if(v != val){
        val = v;
    }
   emit valueChanged(v);
}

//methode
int Widget::value()const
{
    return val;
}
Warum muss ich Das Signal bei der Definition vom Slot angeben ??

/main.cpp

Code: Alles auswählen

#include <QApplication>
#include "widget.h"
#include <QMessageBox>
#include <QString>


//simple nachrichten-box
void MyMessageBox(Widget& a, Widget& b, QString title){
    QString qstr, qval;

    //String zusammenbasteln
    qstr.append(title);
    qstr.append("\na :");
    qval.setNum(a.value());
    qstr.append(qval);
    qstr.append("\nb :");
    qval.setNum(b.value());
    qstr.append(qval);

    QMessageBox::information(NULL, "Widget Information", qstr, QMessageBox::Ok);

}


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Widget *a = new Widget;
    Widget *b = new Widget;

    QObject::connect(a, SIGNAL(valueChanged(int)),
                     b, SLOT(setValue(int)));

    //b.val bekommt den wert 100
    b->setValue(100);
    MyMessageBox(*a,*b,"b->setValue()");
    a->setValue(99);
    MyMessageBox(*a,*b,"a->setValue()");



    return 0;
}
Hoffe das Ich richtig Gepostet Habe.
drewle
Beiträge: 38
Registriert: 4. März 2008 20:59
Kontaktdaten:

Beitrag von drewle »

Hallo,
kannst Du nochmal gnauer beschreiben, was Dich verwirrt? In welcher Zeile wird das Signal angegeben?

Das Signal ist die Funktion: "void valueChanged(int)" und ist in der Klasse Widget unter "signals:" angegeben.
Der Slot ist die Funktion: "void setValue(int)" und ist in der Klasse Widget unter "public slots:" angegeben.

In main werden die beiden dann mit "connect" verbunden.

Drew
Hic Rhodos Hic Salta
http://www.hic-net.de
drewle
Beiträge: 38
Registriert: 4. März 2008 20:59
Kontaktdaten:

Beitrag von drewle »

Hallo nochmal,

jetzt habe ich verstanden!
Du meinst hier:

Code: Alles auswählen

//slots
void Widget::setValue(int v)
{
    if(v != val){
        val = v;
    }
   emit valueChanged(v);
} 
Das muss gar nicht sein. Es sit nur ein Beispiel. (Wenn auch ein verwirrendes.)

In main hast Du 2 Instanzen der Klasse Widget angelegt "a" und "b".
Mit connect verbindest Du:
...das Signal "valueChanged" von der Instanz "a" mit
...dem Slot "setValue" von der Instanz "b"

Wenn jetzt "valueChanged" von "a" emmitet wird wird dann auch "setValue" von "b" aufgerufen.
Dass "emit valueChanged" in "setValue" aufgerufen wird ist wohl etwas ungeschickt gewählt um den Zusammenhang zu zeigen.

Drew
Hic Rhodos Hic Salta
http://www.hic-net.de
Igell
Beiträge: 27
Registriert: 11. November 2009 20:36

Beitrag von Igell »

Danke für die Antwort :P
Werde mich nächstes mal genauer ausdrücken.
Antworten