Seite 1 von 1

Anfängerfrage: "Warum geht das nicht"

Verfasst: 27. Februar 2009 16:25
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.

Verfasst: 27. Februar 2009 16:32
von Christian81
Zumindest gibt es dort ein 'Real Example' wo alles erklärt wird... :roll:

Verfasst: 27. Februar 2009 16:43
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.

Verfasst: 27. Februar 2009 16:50
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