Erster Versuch Autoconnect eines Designer-Dialogs

Alles rund um die Programmierung mit Qt
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Erster Versuch Autoconnect eines Designer-Dialogs

Beitrag 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
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Beitrag 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?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Ich benutzte immer noch den guten alten vi:) bzw. notepad.
Da Qt4 erst mit kdevelop 3.3 gehen soll:(
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Beitrag 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?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

In der Qt Doku wird qmake und der aufbau der .pro Datei beschrieben. Damit solltest du denn zu einem brauchbaren makefile kommen.
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Beitrag 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! :shock:
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Das liegt nur am linken. Denn der Compiler läuft ja sauber durch. Also ist dein Code ok.
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Beitrag von CptGreenwood »

:cry: 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?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

qmake und dann make aufrufen
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Beitrag 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??
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Beitrag 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
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

du benutzte doch die mingw 4.0.1 oder?
CptGreenwood
Beiträge: 18
Registriert: 22. November 2005 10:58

Beitrag 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?
Antworten