Instanz einer von QWidget abgeleiteten Klasse

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

Instanz einer von QWidget abgeleiteten Klasse

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Instanz einer von QWidget abgeleiteten Klasse

Beitrag 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
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag 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.
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!
testapp.cpp:26: error: expected type-specifier before ?add?
Wie sieht denn dein Header aus?

mfg
uhu01
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag 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 
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Im Anhang mal alle Files des Projekts.
Dateianhänge
testapp.tar.gz
(5.79 KiB) 125-mal heruntergeladen
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

okay klappt. Aber wieso? Ich habe noch nirgend gelesen, dass Klassennamen immer mit einem Grossbuschstaben anfangen muessen. Muessen sie?

Danke!
J.
Antworten