Qt4: Compile Problem fuer 08/15 Anwendung

Alles rund um die Programmierung mit Qt
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Qt4: Compile Problem fuer 08/15 Anwendung

Beitrag 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.
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag 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();
} 
DOUBLE ist wie FLOAT nur in HD
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Und wieso Schritt 1?
Das geschied doch alles im Makefile, welches durch qmake erstellt wird.
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag 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
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag von webmaster1987 »

wenn connect nicht bekannt ist versuch mit QObject::connect(...
DOUBLE ist wie FLOAT nur in HD
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Zeige uns mal die .pro Datei.
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

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

Beitrag von BartSimpson »

wie haste denn den Dialog im QDesigne genannt?
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag 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();
} 
DOUBLE ist wie FLOAT nur in HD
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag 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:
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag von webmaster1987 »

okay das mit dem qApp nehm ich zurück :oops:

wer ahnt den das es ein "Globaler Zeiger" ist
DOUBLE ist wie FLOAT nur in HD
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag 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.
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag 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()));
Zuletzt geändert von ChMaster am 6. Oktober 2006 22:16, insgesamt 1-mal geändert.
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag 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
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag 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.
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
Antworten