Zwei kleine unklare Compilermeldungen (Qt)
-
Huhu !
Ich hab jetzt in C++ mittels Qt ein kleines Programm geschrieben und auch alles im Code geflickt, was der Compiler beanstandet hat. Alles, bis auf zwei mir vollkommen unklare Meldungen:
tom@debian:~/eigene dateien/Programmieren/qt-kde Programmierung/tut8$ make g++ -c -pipe -Wall -W -O2 -DQT_NO_DEBUG -DQT_SHARED -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o main.o main.cpp main.cpp:12: semicolon missing after declaration of `MyCannonField' main.cpp:15: multiple types in one declaration make: *** [main.o] Error 1
Das Programm öffnet ein Fenster und platziert darin einen Button Quit, einen Slider, ein selbstdefiniertes QWidget MyCannonField und ein QLCDNumber-Display.
Ich poste mal den Qellcode. Ich weiss ist echt ein bisschen viel verlangt, aber ich würde mich riesig freuen, wenn Ihr Euch das kurz durchlesen würdet:
Hier die Headerdatei: mycannonfield.h
#include <qwidget.h> #define null NULL class MyCannonField : public QWidget { Q_OBJECT int angle; public: MyCannonField( int angle, QWidget* parent, const char* name); int getAngle() { return this->angle; } public slots: void setAngle(int); signals: void angleChanged(int); protected: void paintEvent(QPaintEvent* ); }
Hier ist MyCannonField.cpp:
#include <qwidget.h> #include "mycannonfield.h" #define null NULL MyCannonField::MyCannonField(int angle = 0, QWidget* parent = 0, const char* name = 0) : QWidget( parent, name) { this->angle = angle; } /*..declaration of the setAngle slot...*/ void MyCannonField::setAngle(int angle()) { this->angle = angle; repaint(); emit angleChanged(angle); } /*...paint the angle-information onto the screen...*/ void MyCannonField::paintEvent( QPaintEvent * ) { QString s = "Angle = " + QString::number( ang ); QPainter p( this ); p.drawText( 200, 200, s ); }
Und zum Schluss meine main-Methode:
#include <qapplication.h> #include <qpushbutton.h> #include <qwidget.h> #include <qlcdnumber.h> #include <qlayout.h> #include <qslider.h> #include "mycannonfield.h" #define null NULL /* Compiler beanstandet: Zeile 12 */ class MyWidget: public QWidget { public: MyWidget( QWidget* parent , const char* name ); /* Compiler beanstandet: Zeile 15 */ }; MyWidget::MyWidget( QWidget* parent = null , const char* name = null) : QWidget(parent, name) { /*...GridLayout for formatation...*/ QGridLayout* qGrid = new QGridLayout(this, 2, 2); /*...defining some objects, we want to integrate...*/ QPushButton* qButt = new QPushButton("Quit this shit", this, null); QSlider* qSlider = new QSlider(this); qSlider->setRange(0,99); QLCDNumber *lcd = new QLCDNumber(this); MyCannonField* myCannon = new MyCannonField(25, this, null); /*connect signals and slots of some objects above...*/ QObject::connect(qButt, SIGNAL(clicked()), qApp, SLOT(quit())); QObject::connect( qSlider, SIGNAL( valueChanged(int) ), lcd, SLOT(display(int))); QObject::connect( qSlider, SIGNAL( valueChanged(int)), myCannon, SLOT( setAngle(int))); /*...Now, add all object into the qGrid...*/ qGrid->addWidget(qButt,1,2); qGrid->addWidget(lcd,1,1); qGrid->addWidget(qSlider,2,1); qGrid->addWidget(myCannon,2,2); } //end class MyWidget int main(int argc, char** argv) { QApplication* qApp = new QApplication(argc, argv); MyWidget* myWidget = new MyWidget(); qApp->setMainWidget(myWidget); myWidget->show(); return qApp->exec(); }
Das waren die Quelltexte. Ich finde bis jetzt keinen Fehler, insbesondere in Zeile 12 und 15 nicht.
Ich hoffe einer von Euch weiss hier Bescheid, ich blicke jedenfalls nicht durch.
Über Hilfe würde ich mich jedenfalls sehr freuen.mfg
tom
-
der Compiler sagt doch alles, was du wissen musst.
class und struct deklarationen muessen mit ; abgeschlossen werden
class foo { }; //<-- das ; ist wichtig!
-
Hi !
Vielen Dank für die Antwort. Ich bin aber trotzdem sehr überrascht. Der Compiler verweist auf Zeilen in main.cpp und der Fehler liegt aber in mycannonfield.h. Das ist doch total unlogisch. Hab ich was falsch verstanden ??
Aber ich muss Euch schon wieder mit einer mir unentschlüsselbaren Meldung des Compilers nerven.
tom@debian:~/eigene dateien/Programmieren/qt-kde Programmierung/tut8$ make g++ -c -pipe -Wall -W -O2 -DQT_NO_DEBUG -DQT_SHARED -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o MyCannonField.o MyCannonField.cpp MyCannonField.cpp: In member function `virtual void MyCannonField::paintEvent(QPaintEvent*)': MyCannonField.cpp:22: variable `QPainter p' has initializer but incomplete type make: *** [MyCannonField.o] Error 1
Das erhalte ich, wenn er folgenden Code kompilieren will:
#include <qwidget.h> #include <qstring.h> #include "mycannonfield.h" #define null NULL MyCannonField::MyCannonField(int angle , QWidget* parent , const char* name ) : QWidget( parent, name) { this->angle = angle; } void MyCannonField::setAngle(int angle) { this->angle = angle; repaint(); emit angleChanged(angle); } void MyCannonField::paintEvent( QPaintEvent * ) { QString s = "Angle = " + QString::number( angle ); QPainter p( this ); p.drawText( 200, 200, s ); }
Was bedeutet die Zeiel: variable `QPainter p' has initializer but incomplete type ??
Tut mir echt Leid, wenn das nervt, aber ich bin ein frischer C++ und Qt Coder :p
mfg
tom
-
TomDaHomm schrieb:
Ich bin aber trotzdem sehr überrascht. Der Compiler verweist auf Zeilen in main.cpp und der Fehler liegt aber in mycannonfield.h. Das ist doch total unlogisch.
Nicht wirklich. #include ist eine reine Textersetzung, d.h., an der Stelle, wo #include "blah.h" steht, fuegt der Praeprozessor den Inhalt der Datei blah.h ein. Und damit ist der Fehler dann auch in Deinem Hauptprogramm.
Wundert mich allerdings trotzdem, normalerweise ist der gcc so intelligent, BEIDE Dateien anzugeben... Vielleicht ist das Problem, dass der Fehler erst hinter dem Ende der Headerdatei erkannt werden kann.