Anfängerfrage: "Warum geht das nicht"

Alles rund um die Programmierung mit Qt
Antworten
Souljumper
Beiträge: 23
Registriert: 12. März 2008 14:34

Anfängerfrage: "Warum geht das nicht"

Beitrag von Souljumper »

hi,
ich versuch grad das SLOT/SIGNAL Konzept zu verstehen und hab mir dazu eines der Beispiele aus dem Tutorial geholt. Dort hab ich einen Slider und einen Button drin. Die Schrift des Button soll sich mit dem hochschieben des Sliders vergrößern.

Nun dachte ich mein definiertes SIGNAL wurde von dem moc irgendwie intererpretiert und umgesetzt, aufejdenfall kommt beim kompilieren die meldung das mein signal aufruf in meinem slot nicht bekannt ist.

Undefined symbols:
"MyWidget::changed(int)", referenced from:
MyWidget::resize(int) in main.o
ld: symbol(s) not found


Mein Beispielcode sieht so aus

Code: Alles auswählen

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

 class MyWidget : public QWidget
 {
 public:
     MyWidget(QWidget *parent = 0);
 public slots:
     void resize(int newSize);
 signals:
     void changed(int);
  private:
      QPushButton * quit;
      int x;
 };
 
 void MyWidget::resize(int newSize)
 {
 	if (x < 36)
 	{
 		x *= newSize;
    	quit->setFont(QFont("Times", x, QFont::Bold));
    	emit changed(newSize);                      // <---------- Den Aufruf kennt er nicht - wieso?
    }
 }

 MyWidget::MyWidget(QWidget *parent)
     : QWidget(parent)
 {
     x = 18;
     quit = new QPushButton(tr("Quit"));
     quit->setFont(QFont("Times", x, QFont::Bold));

     QLCDNumber *lcd = new QLCDNumber(2);
     lcd->setSegmentStyle(QLCDNumber::Filled);

     QSlider *slider = new QSlider(Qt::Horizontal);
     slider->setRange(1, 2);
     slider->setValue(1);

     connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
     connect(slider, SIGNAL(valueChanged(int)),
             lcd, SLOT(display(int)));
     connect(slider, SIGNAL(changed(int)), this, SLOT(resize(int)));

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

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     MyWidget widget;
     widget.show();
     return app.exec();
 }
Muss ma da doch noh mehr machen um die SIgnal zu definieren?
http://doc.trolltech.com/4.3/signalsandslots.html
gibt da nicht soviel her.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Zumindest gibt es dort ein 'Real Example' wo alles erklärt wird... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Souljumper
Beiträge: 23
Registriert: 12. März 2008 14:34

Beitrag von Souljumper »

Christian81 hat geschrieben:Zumindest gibt es dort ein 'Real Example' wo alles erklärt wird... :roll:
ja das besteht aber nur aus einem header file. nutzt mich leider wenig.

kann seind as ich auch ganz falsch liege, aber ich vermute meine slot/signal deklaration stimmt nicht.

und das real-example ist nutzloser als das vorhergehende.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du hast Dir das üerhaupt nicht durchgelesen... aber was solls:

1. Q_OBJECT fehlt
2. Die Klassendeklaration muss in einen Header
3. MyWidget::changed(int) fehlt wegen 1. und 2.
4. Die Header-Datei muss natürlich ins pro-File mit aufgenomen werden
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten