Qt4 Hello "Signale und Slots" World

Alles rund um die Programmierung mit Qt
Antworten
opino
Beiträge: 8
Registriert: 12. Januar 2007 02:05

Qt4 Hello "Signale und Slots" World

Beitrag von opino »

Hallo,

ich möchte Slots und Signale selber definieren, leider ist das
Tutorial von Trolltech nicht gerade hilfreich.

http://doc.trolltech.com/4.0/signalsandslots.html
-------------------Teil 1 --------------------------------------
#include <QObject>

class Counter : public QObject
{
Q_OBJECT

public:
Counter() { m_value = 0; }

int value() const { return m_value; }

public slots:
void setValue(int value);

signals:
void valueChanged(int newValue);

private:
int m_value;
};
---------------------------------------------------------------

---------------Teil2 -----------------------------------------
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
--------------------------Teil3 ---------------------------------------
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));

a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
-----------------------------------------------------------------------


ich verstehe das alles bis auf den Teil 3. Das ist die Definition
von dem Slot. Warum ist das nicht in der Klassendefinition drin?
Weil es jetzt nicht in der Klassendefinition mit drin ist weiss ich
erhlich gesagt nicht an welche sette das ins Programm gehört.

Könnte sich bitte jemand erbarmen und diese Codeschnipsel zu
einem lauffähigen Programm machen?

vielen dank im voraus
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Natürlich muss der Code irgendwo hin - dort wo *DU* die Signals mit den Slots verbinden möchtest. z.B. im Konstruktor von Counter oder wo auch immer du möchtest (und es Sinn macht)

Ausserdem würde ich mal das hier lesen und anwenden - sonst kann man den Code nicht lesen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Tarek
Beiträge: 46
Registriert: 3. Oktober 2005 14:29
Kontaktdaten:

Beitrag von Tarek »

ich verstehe das alles bis auf den Teil 3. Das ist die Definition
von dem Slot.
Nö, bitte lies die Dokumentation wirklich erstmal sorgfälltig durch.
Könnte sich bitte jemand erbarmen und diese Codeschnipsel zu
einem lauffähigen Programm machen?
is net schwer:

Code: Alles auswählen

void main(){

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

a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(4Cool; // a.value() == 12, b.value() == 48

}
opino
Beiträge: 8
Registriert: 12. Januar 2007 02:05

Beitrag von opino »

mhh ja also, so sieht es aus und läuft nicht:
Ich habe das jetzt mal mit einem zweiten
Beispiel zusammengemengt, damit ich
noch sehe ob der Code auch läuft.

Code: Alles auswählen


    #include <QApplication>
    #include <QFont>
    #include <QPushButton>
    #include <QLineEdit>
    #include <QLabel>
    class MyWidget : public QWidget
    {
    public:
        MyWidget(QWidget *parent = 0);
    };

    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        setFixedSize(200, 120);

        QPushButton *quit = new QPushButton("Quit", this);
	QLineEdit *test = new QLineEdit("Quit", this);
	QLabel *label = new QLabel("ccc", this);
        quit->setGeometry(62, 40, 75, 30);
	label->setGeometry(62, 80, 120, 30);
        quit->setFont(QFont("Times", 18, QFont::Bold));

	connect(quit, SIGNAL(clicked()),label, SLOT(quit()));
   }



--------------------signal slots tutotial code--------

    #include <QObject>

    class Counter : public QObject
    {
        Q_OBJECT

    public:
        Counter() { m_value = 0; }

        int value() const { return m_value; }

    public slots:
        void setValue(int value);

    signals:
        void valueChanged(int newValue);

    private:
        int m_value;
    };

//???????????ß
void Counter::setValue(int value)
    {
        if (value != m_value) {
            m_value = value;
            emit valueChanged(value);
        }
    }
//???????????
-------------------signal slots tutotial code--------








    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MyWidget widget;
        widget.show();
-------------------signal slots tutotial code--------
Counter a, b;
        QObject::connect(&a, SIGNAL(valueChanged(int)),
                         &b, SLOT(setValue(int)));

        a.setValue(12);     // a.value() == 12, b.value() == 12
        b.setValue(48);     // a.value() == 12, b.value() == 48
-------------------signal slots tutotial code--------

        return app.exec();
    }





opino
Beiträge: 8
Registriert: 12. Januar 2007 02:05

Beitrag von opino »

Tarek hat geschrieben:
ich verstehe das alles bis auf den Teil 3. Das ist die Definition
von dem Slot.
Nö, bitte lies die Dokumentation wirklich erstmal sorgfälltig durch.
Kannst du mir das bitte erklären, ich lese die das seit gestern Nachmittag um drei und
es nicht gescheites dabei herausgekommen. Es würden ja auch schon drei worte reichen was der Code bedeutet
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das Qt-Tutorial behandelt auch Signals und Slots (und es sind lauffähige Programme dabei) - ggf. kanns tdu dort mal nachschauen.
Ein QLabel hat keinen Slot quit() - also kann es nicht funktionieren
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
opino
Beiträge: 8
Registriert: 12. Januar 2007 02:05

Beitrag von opino »

ich habe mir jetzt die tutorials vorgenommen und durchgeackert, der code soll fogendes realisieren: wenn ich ein slider bewege soll sich der andere mitbewegen, das tu es aber nicht und ich könnte heulen. Nun die Preisfrage: Was ist an meinem Programm falsch?

Code: Alles auswählen


#include <QApplication>
    #include <QFont>
    #include <QGridLayout>
    #include <QLCDNumber>
    #include <QPushButton>
    #include <QSlider>
    #include <QVBoxLayout>
    #include <QWidget>

    class LCDRange : public QWidget
    {
    public:
        LCDRange(QWidget *parent = 0);
   int value() const;

    public slots:
        void setValue(int value);

    signals:
        void valueChanged(int newValue);

    private:
        QSlider *slider;



    };

    LCDRange::LCDRange(QWidget *parent)
        : QWidget(parent)
    {
        QLCDNumber *lcd = new QLCDNumber(2);
        QSlider *slider = new QSlider(Qt::Horizontal);
        slider->setRange(0, 99);
        slider->setValue(0);
        connect(slider, SIGNAL(valueChanged(int)),lcd, SLOT(display(int)));
	connect(slider, SIGNAL(valueChanged(int)),this, SIGNAL(valueChanged(int)));

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(lcd);
        layout->addWidget(slider);
        setLayout(layout);
    }

    class MyWidget : public QWidget
    {
    public:
        MyWidget(QWidget *parent = 0);
    };

  int LCDRange::value() const
    {
        return slider->value();
    }

    void LCDRange::setValue(int value)
    {
        slider->setValue(value);
    }


    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        QPushButton *quit = new QPushButton("Quit");
        quit->setFont(QFont("Times", 18, QFont::Bold));
        connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));

        QGridLayout *grid = new QGridLayout;
    

		LCDRange *doof1 = new LCDRange;
		LCDRange *doof2 = new LCDRange;
                grid->addWidget(doof1, 1,0);
		grid->addWidget(doof2, 2,0);

		connect(doof2, SIGNAL(valueChanged(int)),doof1, SLOT(setValue(int)));
	

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(quit);
        layout->addLayout(grid);
        setLayout(layout);
    }


    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MyWidget widget;
        widget.show();
        return app.exec();
    }
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich denke mal Du benutzt qmake. Füge bitte

Code: Alles auswählen

CONIFG += console
in das pro-File ein, erstelle das Makefile mit qmake neu und compiliere Dein Programm. Beim Starten werden auf dem erscheinenden DOS-Fenster Fehlermeldungen ausgegeben (z.B. wenn ein connect falsch gesetzt wurde oder ein Slot nicht vorhanden ist - irgendwas in der Richtung muss dabei Dir falsch sein)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
opino
Beiträge: 8
Registriert: 12. Januar 2007 02:05

Beitrag von opino »

ich mach das aber unter linux?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann muss man das nicht einfügen und die Fehlermeldungen werden auf die Konsole ausgegeben (man muss das Programm natürlich auch von der Konsole starten)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten