QT Callback System noch nicht ganz verstanden
-
schonmal was von copy&paste gehoert?
also zum fehler:
"undefined vtable ..." gibts meist, wenn nicht alle headers und sources im pro file eingetragen sind.
alle headers mit Q_OBJECT muessen unbedingt im pro file stehen, am besten aber alle headers (und zugehoerige sources).
allerdings keine automatisch generierten dateien (moc_xxx, ui_xxx.h, ...).// edit: wenn du nicht weiterkommst poste hier mal den inhalt der pro datei in
.
mfg,
julian
-
######################################################################
# Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007
######################################################################TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .# Input
SOURCES += main.cppBisschen kurz, oder? (Warum ist der Include Pfad nicht gesetzt? Ich dachte qmake macht das alles?)Wie kann man denn in der Konsole Copy&Paste anwenden? Da kann man doch nicht mal was markieren.
-
code tags !!!
###################################################################### # Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007 ###################################################################### TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input SOURCES += main.cpp
so da fehlt noch was denk ich.
sowas wie
TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input SOURCES += main.cpp \ alle.cpp \ anderen.cpp \ dateien.cpp HEADERS += alle.h \ anderen.h \ dateien.h
da eben alle header- und implementationsdateien eintragen. auch mit pfad (relativ zu dem des pro files) also z.b.
HEADERS += src/subdir/antother_subdir/blubb.h
zum kopieren aus der konsole: markieren -> http://img03.picoodle.com/img/img03/9/9/19/f_cmdmarkierem_50e01a7.jpg
dann wenn der kram markiert ist <enter> druecken und du hast es in der zwischenablage.
nicht allzu komfortabel aber besser als immer screenshots hochzuladen.mfg,
julian
-
@copy und paste -> rechte maustaste -> markieren -> enter
@problem:
probier nochmal im projekt vz: qmake -project und dann qmake und dann make
gibts noch dateien ausser der main.cpp?
was steht in der main.cpp?
ist das was in der main.cpp drinnen ist qt 3 oder 4? du hast 4 installiert?
-
jetzt sieht das ganze so aus:
######################################################################
# Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007
######################################################################TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .# Input
SOURCES += main.cppHEADERS += F:\Qt\4.3.1\include\Qt\QWidget.h \
F:\Qt\4.3.1\include\Qt\QApplication.h \
F:\Qt\4.3.1\include\Qt\QPushButton.h \
F:\Qt\4.3.1\include\Qt\QLCDNumber.h \
F:\Qt\4.3.1\include\Qt\QSlider.h \
F:\Qt\4.3.1\include\QtGUI\QVBoxLayout.h \
F:\Qt\4.3.1\include\QtGUI\QGridLayout.hqmake findet auch alle Dateien und erstellt ein Makefile - make liefert diesmal wieder fehler:
make
mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directoryD:/Dokumente und Einstellungen//Eigen e Dateien/Eigene Programme/QT/QT (3)' g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT\_LARGEFILE\_SUPPORT -DQT\_DLL -DQT\_NO\_DEBUG -DQT\_GUI\_LIB -DQT\_CORE\_LIB -DQT\_THREAD\_SUPPORT -DQT\_NEEDS _QMAIN -I"f:\\Qt\\4.3.1\\include\\QtCore" -I"f:\\Qt\\4.3.1\\include\\QtCore" -I"f:\\Qt\\4. 3.1\\include\\QtGui" -I"f:\\Qt\\4.3.1\\include\\QtGui" -I"f:\\Qt\\4.3.1\\include" -I"." - I"f:\\Qt\\4.3.1\\include\\ActiveQt" -I"release" -I"." -I"f:\\Qt\\4.3.1\\mkspecs\\win32-g ++" -o release\\main.o main.cpp g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel oc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o "release\\qt.exe" release\\main. o -L"f:\\Qt\\4.3.1\\lib" -lmingw32 -lqtmain -lQtGui4 -lQtCore4 release\\main.o:main.cpp:(.text$_ZN8MyWidgetC1EP7QWidget[MyWidget::MyWidget(QWidg et*)]+0x2d5): undefined reference to
vtable for LCDRange'
release\main.o:main.cpp:(.text$_ZN8MyWidgetC1EP7QWidget[MyWidget::MyWidget(QWidg
et*)]+0x2dc): undefined reference tovtable for LCDRange' collect2: ld returned 1 exit status mingw32-make[1]: *** [release\\qt.exe] Error 1 mingw32-make[1]: Leaving directory
D:/Dokumente und Einstellungen//Eigene
Dateien/Eigene Programme/QT/QT (3)'
mingw32-make: *** [release] Error 2Danke für den Tipp mit dem kopieren
-
aMan schrieb:
probier nochmal im projekt vz: qmake -project und dann qmake und dann make
Hast du das gemacht?
Die Includefiles gehoeren btw nicht in die pro Datei. Und dir ist hoffentlich bewusst, das du qmake nach jedem veraender der pro Datei neu ausfuehren musst.
-
also:
ich hab jetzt alles nochmal von vorn gemacht.
Ich habe den Quelltext
main.cpp:#include <QWidget.h> #include <QApplication.h> #include <QPushButton.h> #include <QLCDNumber.h> #include <QSlider.h> #include <QVBoxLayout.h> #include <QGridLayout.h> class LCDRange : public QWidget { Q_OBJECT public: LCDRange(QWidget *parent) : QWidget(parent) { QLCDNumber *lcd = new QLCDNumber(2); lcd->setSegmentStyle(QLCDNumber::Filled); 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); }; int value() const { return slider->value(); }; public slots: void setValue(int value) { slider->setValue(value); } signals: void valueChanged(int newValue); private: QSlider *slider; }; class MyWidget : public QWidget { public: MyWidget(QWidget *parent) : QWidget(parent) { quit = new QPushButton("Quit"); quit->setFont(QFont("Times", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); grid = new QGridLayout; previousRange = 0; for (int row = 0; row < 3; ++row) { for (int column = 0; column < 3; ++column) { LCDRange *lcdRange = new LCDRange(this); grid->addWidget(lcdRange, row, column); if (previousRange) connect(lcdRange, SIGNAL(valueChanged(int)),previousRange, SLOT(setValue(int))); previousRange = lcdRange; }; }; layout = new QVBoxLayout(); layout->addWidget(quit); layout->addLayout(grid); setLayout(layout); }; private: QPushButton* quit; QGridLayout* grid; LCDRange* previousRange; QVBoxLayout* layout; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget(NULL); widget.show(); return app.exec(); };
befindet sich in einem Verzeichnis mit dem namen qt (3)
nun wechsele ich in der QT Konsole in dieses Verzeichnis und gebe "qmake -project" ein. Es entsteht eine .pro Datei mit dem Namen "QT (3).pro" ich benenne sie in "qt3.pro" um und gebe "qmake" ein. es entstehen eine "Makefile" eine "Makefile.RELEASE" und eine "Makefile.DEBUG". Nun gebe ich "make" ein und erhalte die oben genannte Fehlermeldung. Was machen?
-
Du hast mehrere Klassen die von QObject erben in einer Datei die vom Moc'ing (Q_OBJECT) betroffen ist.
Tu' die Klasse "LCDRange" in eine separate Datei und es sollte gehen.
-
am besten die klasse in 2 dateien.
lcdrange.h und lcdrange.cpp oder so.und dann
###################################################################### # Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007 ###################################################################### TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input SOURCES += main.cpp \ lcdrange.cpp HEADERS += lcdrange.h
und BITTE nutze verdammtnochmal CODE TAGS!
mfg,
julian
-
Wenn du mir sagst was code tags sein sollen... Kommentare?
-
alfonsospringer schrieb:
Wenn du mir sagst was code tags sein sollen... Kommentare?
Nein, das sind die eckigen klammern in denen code,/code oder cpp, /cpp steht.
Sie dienen dem Codehighlighting und machen somit den Code lesbarer.
Sie zu nutzen erhöhen die Erfolgschancen eines Threads drastisch
-
Juhu ! Es klappt! Warum muss man denn die Klassen in seperate Dateien fassen?
->Gibt es sowas wie qmake (zum erzeugen von makefiles) auch für normales c++ ohne qt?
-
qmake kann man fuer normales cpp auch verwenden.
ansonsten gibts afaik die autotools und cmake hat wahrscheinlich auch etwas in der art..schau mal im artikelforum nach..
-
Wenn ich die Makefile für mein stan-dart HalloWelt Programm mit qmake -project und qmake erzeuge kann ich diese zwar (mit make) zu einem lauffähigen Programm kompilieren (0 Fehler, 0 Warnungen), aber es wird kein Text ausgegeben. Das Fenster bleibt schwarz bis auf das:
Drücken Sie eine beliebige Taste . . .
-
komisch, bei mir gehts..
probier vielleicht in der pro datei QT -= gui
http://doc.trolltech.com/4.2/qmake-project-files.html#declaring-qt-libraries
-
immer noch das selbe Problem... Und ich muss wirklich nirgendwo ausser im Quelltext auf iostream verweisen?
-
haste probiert mit start->ausfuehren->cmd und zum programmvz wechseln und dann ausfuehren?
ansonsten hab ich keine idee, aufm linux gehts.
-
ja, aber trotzdem danke
-
wenn du ein ganz "normales" c++ programm hast ohne qapplication, probier mal "CONFIG += qt" und "QT -= core" im pro file.
ich hab mal qt-klassen in einem non-qt-programm benutzt, da ging es so.mfg,
julian