Seite 1 von 1

Instanz einer von QWidget abgeleiteten Klasse

Verfasst: 31. Dezember 2006 07:27
von joebar
Hallo,

ich habe folgende Klassen:

Klasse testapp (abgeleitet von QMainWindow)
Klasse mywidget (abgeleitet von QWidget)
Klasse add (abgeleitet von mywidget)
Klasse sub (abgeleitet von mywidget)

In diesen Klassen moechte ich nun verschiedene Funktionen implementieren.

In einem frueheren Post hatte man mir zu der vorgehensweise geraten und u.a. geschrieben
Die beiden Klassen add und sub werden im Konstruktor der Klasse testapp instanziert:

addWidget=new add(this);
subWidget=new sub(this);
Das habe ich nun probiert, der Konstruktor von testapp.cpp sieht so aus:

Code: Alles auswählen

#include "testapp.h"
#include "add.h"

using namespace std;

testapp::testapp(QMainWindow *parent) : QMainWindow(parent){
	setupUi(this);
	
	// setup connections
	connect(actionQuit,SIGNAL (triggered()), this, SLOT(slotClose()));
	connect(add,SIGNAL (clicked()), this, SLOT(calculate_add()));
	connect(sub,SIGNAL (clicked()), this, SLOT(calculate_sub()));
	connect(actionA,SIGNAL (triggered()), this, SLOT(page_add()));
	connect(actionSub,SIGNAL (triggered()), this, SLOT(page_sub()));
	add addWidget;
	addWidget = new add(this);
}
Leider gibt das beim uebersetzen einen Fehler:

Code: Alles auswählen

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(QMainWindow*)?:
testapp.cpp:25: error: expected `;' before ?addWidget?
testapp.cpp:25: warning: statement has no effect
testapp.cpp:26: error: ?addWidget? was not declared in this scope
testapp.cpp:26: error: expected type-specifier before ?add?
testapp.cpp:26: error: expected `;' before ?add?
make: *** [testapp.o] Error 1
Mich wundert, dass er sagt "addWidget" waere nicht declared, ich habe in der Zeile drueber doch ein "add addWidget" fuer die Deklarierung.

Ihr habt doch sicher eine Idee, oder?

Danke,
J.

Re: Instanz einer von QWidget abgeleiteten Klasse

Verfasst: 31. Dezember 2006 10:09
von franzf
Hi
joebar hat geschrieben:Das habe ich nun probiert, der Konstruktor von testapp.cpp sieht so aus:

Code: Alles auswählen

#include "testapp.h"
#include "add.h"

using namespace std;

testapp::testapp(QMainWindow *parent) : QMainWindow(parent){
	setupUi(this);
	
	// setup connections
	connect(actionQuit,SIGNAL (triggered()), this, SLOT(slotClose()));
	connect(add,SIGNAL (clicked()), this, SLOT(calculate_add()));
	connect(sub,SIGNAL (clicked()), this, SLOT(calculate_sub()));
	connect(actionA,SIGNAL (triggered()), this, SLOT(page_add()));
	connect(actionSub,SIGNAL (triggered()), this, SLOT(page_sub()));
	add addWidget;
	addWidget = new add(this);
}
Mich wundert, dass er sagt "addWidget" waere nicht declared, ich habe in der Zeile drueber doch ein "add addWidget" fuer die Deklarierung.
Ui, da sind mehrere Fehler ;)

Als allererstes: wenn du dynamisch Speicher mittels new zuweisen willst, geht das nur mit einem Zeiger:

Code: Alles auswählen

// add addWidget = new add( this );  <- in java sicherlich OK, aber nicht in C++!!!
add *addWidget = new add( this );  // <- richtige C++-Syntax
Du musst zuerst deine Objekte instanziieren, bevor du mit diesen connecten kannst:

Code: Alles auswählen

// im Konstruktor von testapp:
add *addWidget = new add( this );
sub *subWidget = new sub( this );
nun kannst du die Signals clicked() deiner beiden Objekte (also nicht der Klassen) abfangen und den Slots deines testapps zuweisen:

Code: Alles auswählen

connect( addWidget, SIGNAL(clicked()), this, SLOT(calculate_add()));
connect( subWidget, SIGNAL(clicked()), this, SLOT(calculate_sub()));
Jetzt sollte es funktionieren.

Grüße
Franz

Verfasst: 31. Dezember 2006 10:33
von joebar
Okay, mal sehen...

Code: Alles auswählen

#include "testapp.h"
#include "add.h"

#include <QDebug>
#include <QString>
#include <cmath>
#include <iostream>

using namespace std;

void testapp::calculate_add(){
}

testapp::testapp(QMainWindow *parent) : QMainWindow(parent){
	setupUi(this);


	add *addWidget = new add(this);
}
ist jezt mein Konstruktor, habe die connects mal raus genommen um keine Fehlerquelle hier zu haben (aber trotzdem danke hatte ich uebersehen, dass dort noch die Klassen und nicht die Instanzen standen).

Leider kommt immer noch ein Fehler

Code: Alles auswählen

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 testapp.o testapp.cpp
testapp.cpp: In constructor ?testapp::testapp(QMainWindow*)?:
testapp.cpp:26: error: ?addWidget? was not declared in this scope
testapp.cpp:26: error: expected type-specifier before ?add?
testapp.cpp:26: error: expected `;' before ?add?
make: *** [testapp.o] Error 1

sieht irgendwie dem ersten ziemlich aehnlich...

Noch eine Idee?

Danke,
J.

Verfasst: 31. Dezember 2006 13:39
von uhu01
Hy!
testapp.cpp:26: error: expected type-specifier before ?add?
Wie sieht denn dein Header aus?

mfg
uhu01

Verfasst: 1. Januar 2007 03:23
von joebar
ziemlich leer der header da ich Stueck fuer Stueck am "basteln" bin...

add.h

Code: Alles auswählen

#ifndef ADD_H
#define ADD_H

#include "mywidget.h"

class add : public mywidget{
public:
	add();
	~add();
private slots:
	
};

#endif
testapp.h zur "Sicherheit" auch nochmal

Code: Alles auswählen

#ifndef TESTAPP_H
#define TESTAPP_H

#include "ui_testapp.h"


class testapp : public QMainWindow, public Ui::testapp{
	Q_OBJECT

public:
	testapp (QMainWindow *parent = 0);
	~testapp();
private slots:
	virtual void calculate_add();
	void calculate_sub();
	void slotClose();
	void page_sub();
	void page_add();

private:

	
};

#endif 

Verfasst: 2. Januar 2007 15:02
von joebar
Im Anhang mal alle Files des Projekts.

Verfasst: 2. Januar 2007 16:45
von franzf
Es klappt, wenn du:

1) deine add-Klasse groß schreibst (also class Add statt add)
Und in allen Files (add.cpp, add.h, testapp.cpp) add durch Add ersetzt.

2) Hat dein Add-Konstruktor keinen Parameter (Vergleiche add.h/cpp und Initialisierung in testapp.cpp)...

Grüße
Franz

Verfasst: 3. Januar 2007 02:10
von joebar
okay klappt. Aber wieso? Ich habe noch nirgend gelesen, dass Klassennamen immer mit einem Grossbuschstaben anfangen muessen. Muessen sie?

Danke!
J.