Seite 1 von 1

Qt4 Hello "Signale und Slots" World

Verfasst: 19. Januar 2007 11:09
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

Verfasst: 19. Januar 2007 11:14
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.

Verfasst: 19. Januar 2007 11:22
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

}

Verfasst: 19. Januar 2007 11:23
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();
    }






Verfasst: 19. Januar 2007 11:27
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

Verfasst: 19. Januar 2007 12:00
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

Verfasst: 19. Januar 2007 22:52
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();
    }

Verfasst: 20. Januar 2007 10:01
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)

Verfasst: 25. Januar 2007 12:15
von opino
ich mach das aber unter linux?

Verfasst: 25. Januar 2007 12:35
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)