Qt4 Hello "Signale und Slots" World
Qt4 Hello "Signale und Slots" World
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
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:
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.
Ausserdem würde ich mal das hier lesen und anwenden - sonst kann man den Code nicht lesen.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Nö, bitte lies die Dokumentation wirklich erstmal sorgfälltig durch.ich verstehe das alles bis auf den Teil 3. Das ist die Definition
von dem Slot.
is net schwer:Könnte sich bitte jemand erbarmen und diese Codeschnipsel zu
einem lauffähigen Programm machen?
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
}
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.
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();
}
Kannst du mir das bitte erklären, ich lese die das seit gestern Nachmittag um drei undTarek hat geschrieben:Nö, bitte lies die Dokumentation wirklich erstmal sorgfälltig durch.ich verstehe das alles bis auf den Teil 3. Das ist die Definition
von dem Slot.
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:
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:
Ich denke mal Du benutzt qmake. Füge bitte
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)
Code: Alles auswählen
CONIFG += console
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten: