Seite 1 von 2

Qt4: Compile Problem fuer 08/15 Anwendung

Verfasst: 6. Oktober 2006 08:10
von joebar
Hallo,

analog wie im Thread "Subclassing" beschrieben habe ich mal versucht mein erstes Qt4 Programm zu schreiben. Ich habe im Designer ein File testapp.ui angelegt. Es ist die Standardform "Dialog mit Button unten", sonst nix.

Des weiteren habe ich von Hand das folgende gemacht:

1. uic -o ui_testapp.h testapp.ui aufgerufen
2. main.cpp

Code: Alles auswählen


#include <QtCore>
#include "QtGui"
#include "testapp.h"

int main( int argc, char* argv[]){

QApplication a(argc, argv);
TestApp w;
w.show();
a.connect(&a, SIGNAL(lastWindowClosed()),a&, SLOT(quit()));
return a.exec();
}

3. testapp.h

Code: Alles auswählen

#ifndef TESTAPP_H
#define TESTAPP_H

#include "ui_testapp.h"

#include <QtGui>
#include <QtCore>

class TestApp : public QWidget, public Ui::TestApp{
Q_OBJECT

public:
	TestApp (QWidget *parent = 0);
	~TestApp();
private slots:
	void slotClose();
};

#endif //TESTAPP_H
4. testapp.cpp

Code: Alles auswählen

#include "testapp.h"

#include <QtGui>
#include <QtCore>

TestApp::TestApp(QWidget *parent) : QWidget(parent)
{
setupUi(this);
connect(okButton, SIGNAL (clicked()), this, SLOT(slotClose()));

}

TestApp::~TestApp()
{}

void TestApp::slotClose()
{
qApp->quit();
}
5. qmake -project
6. qmake
7. make

Nun bekomme ich den folgenden Fehler:

guest@linux:~/Desktop/testapp> make
g++ -c -pipe -fno-strict-aliasing -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/default -I. -I/usr/include/QtGui -I/usr/include/QtCore -I/usr/include -I. -I. -I. -o main.o main.cpp
testapp.h:9: error: expected class-name before ‘{’ token
main.cpp: In function ‘int main(int, char**)’:
main.cpp:10: error: expected primary-expression before ‘,’ token
make: *** [main.o] Error 1

Ich kann leider nicht sehen was falsch ist. Wer kann helfen?

Danke,
J.

Verfasst: 6. Oktober 2006 09:43
von webmaster1987
ich weiß jetzt nicht obs nen unterschied macht aber die qt klassen werden meiste so includiert #include <QtGui> (ehemals #include "QtGui")

Code: Alles auswählen

#include <QtCore>
#include "QtGui"
#include "testapp.h"

int main( int argc, char* argv[]){

QApplication a(argc, argv);
TestApp w;
w.show();
/*####### 
# 1. nur connect nicht a.connect
# 2. eine anwendung wird automatisch geschlossen wenn das hauptfenster geschlossen wird
#######*/
a.connect(&a, SIGNAL(lastWindowClosed()),a&, SLOT(quit()));
return a.exec();
} 

Verfasst: 6. Oktober 2006 13:39
von BartSimpson
Und wieso Schritt 1?
Das geschied doch alles im Makefile, welches durch qmake erstellt wird.

Verfasst: 6. Oktober 2006 18:48
von joebar
So habe folgendes gemacht:

1. Den ersten Schritt mit uic ... weg gelassen
2. Die "QtGui" im include durch <QtGui> in main.cpp ersetzt

-> Gleiches Problem

3. zusaetzlcih a.connect durch connect ersetzt

-> Gleiches Problem plus, dass connect in dem Scope nicht bekannt ist

Verfasst: 6. Oktober 2006 19:03
von webmaster1987
wenn connect nicht bekannt ist versuch mit QObject::connect(...

Verfasst: 6. Oktober 2006 19:04
von BartSimpson
Zeige uns mal die .pro Datei.

Verfasst: 6. Oktober 2006 20:37
von joebar
connect kennt er jetzt. Der Original-Fehler ist aber immer noch da.

Die pro Datei sieht so aus:

TEMPLATE = app
TARGET +=
DEPENDPATH +=
INCLUDEPATH +=

# Input
HEADERS += testapp.h
FORMS += testapp.ui
SOURCES += main.cpp testapp.cpp


Ist so orginal mit qmake -project erstellt worden.

Verfasst: 6. Oktober 2006 20:51
von BartSimpson
wie haste denn den Dialog im QDesigne genannt?

Verfasst: 6. Oktober 2006 21:40
von webmaster1987
was mir auch gerade noch auffällt ist

Code: Alles auswählen

void TestApp::slotClose()
{
qApp->quit();
} 
wo nimmst du den das qApp her soweit ich weiß geht man da doch nach der "wenn alle fenster geschlossen sind ist die anwendung beendet" taktik vor

müsste dann so aussehen

Code: Alles auswählen

void TestApp::slotClose()
{
close();
} 

Verfasst: 6. Oktober 2006 22:03
von ChMaster
webmaster1987 hat geschrieben:wo nimmst du den das qApp her soweit ich weiß geht man da doch nach der "wenn alle fenster geschlossen sind ist die anwendung beendet" taktik vor
da gebe ich dir mal ausnahmsweise recht :)

es kommt aber unter umständen vor das sich das programm nicht sauber
beendet und noch läuft. daher ist es ab und an zu empfehlen qApp->quit();
zu benutzen, oder auf die harte tur, rechner ausschalten :twisted:

Verfasst: 6. Oktober 2006 22:09
von webmaster1987
okay das mit dem qApp nehm ich zurück :oops:

wer ahnt den das es ein "Globaler Zeiger" ist

Verfasst: 6. Oktober 2006 22:12
von joebar
Habe die Stelle mit qapp in close() geaendert. Habe die "ObjectName" von "QObject" im Property Editor vom designer in TestApp geaendert.

Damit hat sich die Fehlermeldung etwas "verkleinert", es bleibt noch

main.cpp:10: error: expected primary-expression before ‘,’ token

Danke,
J.

Verfasst: 6. Oktober 2006 22:13
von ChMaster
@webmaster1987
hehe, nicht so schlimm, ich musste es auch auf die harte tur kennen lernen.
qApp->quit(); hat mir da bei einigen sachen geholfen. sonst hast du recht ich
nehme auch close(); her aber nur bei widgets denn bei dialogen nehme ich
QDialog::reject(); oder QDialog::accpet(); her.

@joebar
joebar hat geschrieben:main.cpp:10: error: expected primary-expression before ‘,’ token
ändere mal das:

Code: Alles auswählen

connect(&a, SIGNAL(lastWindowClosed()),a&, SLOT(quit())); 
in das:

Code: Alles auswählen

connect(&a, SIGNAL(lastWindowClosed()),&a, SLOT(quit()));

Verfasst: 6. Oktober 2006 23:11
von joebar
Oh ja... :oops: damit waere der Fehler behoben, danke. Leider kommt jetzt wieder ein neuer Fehler:

g++ -c -pipe -fno-strict-aliasing -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/default -I. -I/usr/include/QtGui -I/usr/include/QtCore -I/usr/include -I. -I. -I. -o main.o main.cpp
g++ -c -pipe -fno-strict-aliasing -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/default -I. -I/usr/include/QtGui -I/usr/include/QtCore -I/usr/include -I. -I. -I. -o testapp.o testapp.cpp
testapp.cpp: In constructor ?TestApp::TestApp(QWidget*)?:
testapp.cpp:8: error: no matching function for call to ?TestApp::setupUi(TestApp* const)?
ui_testapp.h:23: note: candidates are: void Ui_TestApp::setupUi(QDialog*)
make: *** [testapp.o] Error 1

Verfasst: 6. Oktober 2006 23:21
von ChMaster
du hast einen entscheidenden fehler gemacht. dieser ist aber nicht
schlimm, da dies mir auch passiert ist am anfang, wohlbemerkt nur
bei qt4 ;)

du hast ein qdialog erstellt also muss es bei dir so lauten:
testapp.h

Code: Alles auswählen

#ifndef TESTAPP_H
#define TESTAPP_H

#include "ui_testapp.h"

#include <QtGui>
#include <QtCore>

class TestApp : public QDialog, public Ui::TestApp{
Q_OBJECT

public:
   TestApp (QDialog *parent = 0);
   ~TestApp();
private slots:
   void slotClose();
};

#endif //TESTAPP_H
testapp.cpp

Code: Alles auswählen

#include "testapp.h"

#include <QtGui>
#include <QtCore>

TestApp::TestApp(QDialog *parent) : QDialog(parent)
{
setupUi(this);
connect(okButton, SIGNAL (clicked()), this, SLOT(slotClose()));

}

TestApp::~TestApp()
{}

void TestApp::slotClose()
{
close();
} 
wenn du ein qwidget erstellt hättest, dann wäre es richtig.