Seite 1 von 3
Erster Versuch Autoconnect eines Designer-Dialogs
Verfasst: 24. November 2005 14:09
von CptGreenwood
Hi,
ich möchte gerne in die Thematik Auto-Connect aus einem Designer-Dialog in den eigenen Code einsteigen und arbeite mich gerade durch die Doku. Allerdings bin ich schon bei einem sehr einfachen Prog auf Probleme gestossen. Hier der Code:
imagedialog.h:
Code: Alles auswählen
#include "ui_imagedialog.h"
class ImageDialog : public QDialog, private Ui::Dialog
{
Q_OBJECT
public:
ImageDialog(QWidget *parent = 0);
private slots:
void on_buttonMax_clicked();
};
imagedialog.cpp:
Code: Alles auswählen
#include <QtGui>
#include "imagedialog.h"
ImageDialog::ImageDialog(QWidget *parent)
: QDialog(parent)
{
setupUi(this);
}
void ImageDialog::on_buttonMax_clicked()
{
// still to-do
}
main.cpp:
Code: Alles auswählen
#include <QApplication>
#include "imagedialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ImageDialog *dialog = new ImageDialog;
dialog->show();
return app.exec();
}
Beim Compilieren meldet der Linker:
Compiling: main.cpp
Compiling: imagedialog.cpp
Linking executable: C:\Temp\qttest\qttest.exe
.objs\imagedialog.o:imagedialog.cpp:(.text+0x17d): undefined reference to `vtable for ImageDialog'
.objs\imagedialog.o:imagedialog.cpp:(.text+0x189): undefined reference to `vtable for ImageDialog'
.objs\imagedialog.o:imagedialog.cpp:(.text+0x277): undefined reference to `vtable for ImageDialog'
.objs\imagedialog.o:imagedialog.cpp:(.text+0x283): undefined reference to `vtable for ImageDialog'
Process terminated with status 1 (0 minutes, 4 seconds)
Ich habe absolut keine Ahnung, wo das Problem liegt.
Wäre schön, wenn jemand helfen könnte.
Greetz,
Cpt
Verfasst: 24. November 2005 14:34
von BartSimpson
Das düfte wie immer an der .pro Datei liegen. Da der moc nicht benutzt bzw. dessen Ergebnisse nicht einbezogen werden. Zeige mal deine .pro Datei
Verfasst: 24. November 2005 14:39
von CptGreenwood
Hmm. Ich bin einer der IDE-Benutzer. Ich habe das eigentliche Proggi in Code::Blocks entwickelt (ähnlich Dev-C++). Das Formular habe ich mit dem Designer gebastelt und mit "uic imagedialog.ui -o imagedialog.h" eine Headerdatei draus basteln lassen. Dann habe ich den Dialog in meinem Programm benutzt.
Das hat bei meinem ersten Versuch, wo nur designer-interne Signal-Slot-Zuordnungen rin waren auch gut funktioniert.
Habe also weder qmake noch eine Projektdatei benutzt.
Ist das in diesem Fall schlecht?
Verfasst: 24. November 2005 14:47
von BartSimpson
Ich benutzte immer noch den guten alten vi:) bzw. notepad.
Da Qt4 erst mit kdevelop 3.3 gehen soll:(
Verfasst: 24. November 2005 14:54
von CptGreenwood
Wie groß ist denn die Wahrscheinlichkeit, dass mein Problem nicht an dem Programm, sondern der Art liegt, mit der ich es erstelle?
Da ich keinerlei Erfahrung auf der Befehlszeile habe... kennst du ein gutes Tutorial, wo man Step by Step erfährt, wie man mit Projektdateien, Makedateien, qmake, make, u.s.w. umgeht?
Verfasst: 24. November 2005 15:03
von BartSimpson
In der Qt Doku wird qmake und der aufbau der .pro Datei beschrieben. Damit solltest du denn zu einem brauchbaren makefile kommen.
Verfasst: 24. November 2005 15:32
von CptGreenwood
Ich kann mir einfach nicht vorstellen, dass es an der Art, das Programm zu erstellen liegt. Ich habe das Gefühl ich mache einen Fehler, der auf die Vererbung zurückzuführen ist. "vtables" haben doch irgendetwas mit Polymorphie und virtuellen Funktionen zu tun, oder?
Dafür spräche auch die Tatsache, dass das direkte Anzeigen eines Dialogs in meinem Hauptprogramm sehr gut funktionierte. Ich bekam erst das Problem, als ich den Dialog nach Anleitung der Doku in eine Klasse mit einfacher Vererbung von QDialog packte.
Nochmal übersichtlicher der Code:
Code: Alles auswählen
#include <QApplication>
#include "ui_imagedialog.h"
class ImageDialog : public QDialog
{
Q_OBJECT
public:
ImageDialog(QWidget *parent = 0);
private:
Ui::Dialog ui;
};
ImageDialog::ImageDialog(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ImageDialog *dialog = new ImageDialog;
dialog->show();
return app.exec();
}
Bitte... das muss doch auch mit Vererbung gehen... ich werde wahnsinnig!

Verfasst: 24. November 2005 17:06
von BartSimpson
Das liegt nur am linken. Denn der Compiler läuft ja sauber durch. Also ist dein Code ok.
Verfasst: 25. November 2005 10:35
von CptGreenwood

Wie würde denn der Befehl lauten, um das Prog auf der Befehlszeile zu erstellen. Die "main.cpp", "imagedialog.ui", "projekt.pro" und die "ui_imagedialog.h" befinden sich im Verzeichnis.
Die Projektdatei sieht so aus:
Code: Alles auswählen
TEMPLATE = app
FORMS = imagedialog.ui
SOURCES = main.cpp
Was kommt nun?
Verfasst: 25. November 2005 11:21
von BartSimpson
qmake und dann make aufrufen
Verfasst: 25. November 2005 11:30
von CptGreenwood
qmake ist ohne Meldung durchgelaufen.
make hat scheinbar ein Problem:
Code: Alles auswählen
C:\Temp\qttest>c:\programme\codeblocks\bin\make
c:/programme/codeblocks/bin/make -f Makefile.Debug
make[1]: Entering directory `C:/Temp/qttest'
g++ -c -g -g -frtti -fexceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL
-DQT_CORE_LIB -DQT_GUI_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"C:/Programme
/Qt/include/QtGui" -I"C:/Programme/Qt/include/QtCore" -I"C:/Programme/Qt/include
" -I"C:/Programme/Qt/include/ActiveQt" -I"debug" -I"." -I"C:/Programme/Qt/mkspec
s/win32-g++" -o debug\main.o main.cpp
g++ -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runt
ime-pseudo-reloc -Wl,-subsystem,windows -o "debug\project.exe" debug\main.o -L"
C:\Programme\Qt\lib" -lmingw32 -lqtmaind -lQtCored4 -lQtGuid4
\Programme\CodeBlocks\bin\..\lib\gcc\mingw32\3.4.4\..\..\..\..\mingw32\bin\ld.ex
e: cannot find -lqtmaind
collect2: ld returned 1 exit status
make[1]: *** [debug\project.exe] Error 1
make[1]: Leaving directory `C:/Temp/qttest'
c:\programme\codeblocks\bin\make: *** [debug] Error 2
Was ist denn bitte qtmaind und warum wirds nicht gefunden??
Verfasst: 25. November 2005 12:06
von BartSimpson
du versuchts eine debug version zu bauen ohne die debug libs.
baue mal das noch in deine .pro datei ein:
CONFIG += qt release
und sann wieder qmake und make
Verfasst: 25. November 2005 12:35
von CptGreenwood

Na gucke da... und hier haben wir wieder den vtable (tief seufz!)
Code: Alles auswählen
C:\Temp\qttest>c:\programme\codeblocks\bin\make
c:/programme/codeblocks/bin/make -f Makefile.Release
make[1]: Entering directory `C:/Temp/qttest'
g++ -c -O2 -O2 -frtti -fexceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_D
LL -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN
-I"C:/Programme/Qt/include/QtGui" -I"C:/Programme/Qt/include/QtCore" -I"C:/Prog
ramme/Qt/include" -I"C:/Programme/Qt/include/ActiveQt" -I"release" -I"." -I"C:/P
rogramme/Qt/mkspecs/win32-g++" -o release\main.o main.cpp
g++ -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runt
ime-pseudo-reloc -Wl,-s -Wl,-s -Wl,-subsystem,windows -o "release\project.exe" r
elease\main.o -L"C:\Programme\Qt\lib" -lmingw32 -lqtmain -lQtCore4 -lQtGui4
release\main.o:main.cpp:(.text+0x6c): undefined reference to `vtable for ImageDi
alog'
release\main.o:main.cpp:(.text+0x73): undefined reference to `vtable for ImageDi
alog'
release\main.o:main.cpp:(.text+0x14c): undefined reference to `vtable for ImageD
ialog'
release\main.o:main.cpp:(.text+0x153): undefined reference to `vtable for ImageD
ialog'
collect2: ld returned 1 exit status
make[1]: *** [release\project.exe] Error 1
make[1]: Leaving directory `C:/Temp/qttest'
c:\programme\codeblocks\bin\make: *** [release] Error 2
Verfasst: 25. November 2005 12:43
von BartSimpson
du benutzte doch die mingw 4.0.1 oder?
Verfasst: 25. November 2005 12:57
von CptGreenwood
Hmmm....
ehrlich gesagt, ich weiß es nicht genau. Ich benutzte die Version die mit dem neusten Release von Code::Blocks (
www.codeblocks.org) ausgeliefert wird.
Gibts anhand der Dateien eine Möglichkeit, die Version herauszufinden?