eigenes Widget: Syntax für Konstruktor?

Alles rund um die Programmierung mit Qt
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

eigenes Widget: Syntax für Konstruktor?

Beitrag von mikro »

hi,
ich habe je eine Klasse um von QTreeWidget und QTreeWidgetItem abzuleiten. Mit http://www.qtnode.net/wiki/Widget_parenting kam ich jetzt schon so weit, dass ihm meine Klasse
class TREEANLAGEN: public QTreeWidget
wohl passt, nachdem ich ff. Konstruktor anbiete:
TREEANLAGEN::TREEANLAGEN(QWidget *parent) : QTreeWidget(parent) {
}
bei der von QTreeWidgetItem abgeleiteten Klasse habe ichs genauso gemacht:

Code: Alles auswählen

class ANLAGE : public QTreeWidgetItem {
  Q_OBJECT
    // Operations
 public:
    ANLAGE(QWidget * parent = 0);
    ANLAGE(QString oid, QWidget * parent = 0);
...
und in der .cpp:
ANLAGE::ANLAGE(QWidget *parent)  : QTreeWidgetItem(parent) {
    
}
da beschwert er sich aber:

Code: Alles auswählen

ANLAGE.cpp: In constructor `ANLAGE::ANLAGE(QWidget*)':
ANLAGE.cpp:2: error: call of overloaded `QTreeWidgetItem(QWidget*&)' is ambiguous
D:/Qt/4.1.2/include/QtGui/../../src/gui/itemviews/qtreewidget.h:55: note: candidates are: QTreeWidgetItem::QTreeWidgetItem(const QTreeWidgetItem&) <near match>
D:/Qt/4.1.2/include/QtGui/../../src/gui/itemviews/qtreewidget.h:49: note:
          QTreeWidgetItem::QTreeWidgetItem(QTreeWidget*, int) <near match>
was ist daran missverständlich?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

won mir aus ... nur die obere classe ...
QTreeWidget ( QWidget * parent = 0 ) braucht parent...

die untere .... QTreeWidgetItem ( QTreeWidget * parent, int type = Type )

du bist einen schritt zu hoch ... das heist QTreeWidget muss parent werden.....
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

ah, also kein Syntaxfehler, sondern ich hätte mir die vorhandene Klasse besser anschauen sollen. Da hätte ich mir mein Geschreibsel ja noch lange anstarren können ;)
Jetzt kriege ich ff. Fehlermeldung:

Code: Alles auswählen

debug\moc_ANLAGE.cpp:37: error: `staticMetaObject' is not a member of `QTreeWidgetItem'
debug\moc_ANLAGE.cpp: In member function `virtual void* ANLAGE::qt_metacast(const char*)':
debug\moc_ANLAGE.cpp:51: error: `qt_metacast' is not a member of `QTreeWidgetItem'
debug\moc_ANLAGE.cpp: In member function `virtual int ANLAGE::qt_metacall(QMetaObject::Call, int, void**)':
debug\moc_ANLAGE.cpp:56: error: `qt_metacall' is not a member of `QTreeWidgetItem'
nachdem der Fehler vom moc kommt habe ich schonmal ein make clean;qmake;make probiert, das gibt aber auch keinen Unterschied.
Fies finde ich, dass er sich jetzt gar nicht auf meinen Code bezieht sondern direkt an QTreeWidgetItem rumkritisiert, dabei muss es ja doch irgendwas sein, was ich überschrieben habe. Nochmal der aktuelle Stand:

Code: Alles auswählen

ANLAGE.h
#ifndef ANLAGE_h
#define ANLAGE_h

#include <QTreeWidgetItem>
#include <QString>
#include <QMap>
#include <QVariant>

#include "KOSTENART.h"

// Vorwärtsdeklaration
class TREEANLAGEN;

class ANLAGE : public QTreeWidgetItem {
  Q_OBJECT
    // Operations
 public:
    ANLAGE( QTreeWidget * parent, int type = 1);
    ANLAGE(QString oid, QTreeWidget * parent, int type = 1);

    void setKostenNetto(float kostenNetto);
    void setUmsatzsteuer(float umsatzsteuer);
    void addAttribut(QString typ, QVariant wert);
    void newBrother();
    void addKosten(int kostenart);
    void readDB();
    void writeDB();

 protected:

    int calcoid2KennNummer(QString oid);

    // Attributes
 public:
    int uid;
    QString oid;
    QString bezeichnung1;
    QString bezeichnung2;
    QMap<QString,int> fremdAttribute;
    QMap<QString,float> floatAttribute;
    QMap<QString,QString> textAttribute;
    float kosten_netto;
    float kosten_brutto;
    float umsatzsteuer;
    int massnahme;
    int kennNummer[];
  protected:
    QMap<QString,QVariant> Attribute;

    // Associations
 public:

    TREEANLAGEN* tree;
    KOSTENART*      kostenarten[];

//end of class ANLAGE
};
#endif

Code: Alles auswählen

ANLAGE.cpp
#include "ANLAGE.h"

ANLAGE::ANLAGE( QTreeWidget * parent, int type ) : QTreeWidgetItem (parent,type) {

}

ANLAGE::ANLAGE(QString oid, QTreeWidget * parent, int type) {
	this->oid = oid;
	ANLAGE(parent, type);
}

void ANLAGE::setKostenNetto(float kostenNetto) {
    
}

void ANLAGE::setUmsatzsteuer(float umsatzsteuer) {
    
}

void ANLAGE::addAttribut(QString typ, QVariant wert) {
    
} 

void ANLAGE::newBrother() {
    
}

void ANLAGE::addKosten(int kostenart) {
    
}

void ANLAGE::readDB() {
    
}

void ANLAGE::writeDB() {
    
}

int ANLAGE::calcoid2KennNummer(QString oid) {
    return 0;
}
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

#ifndef ANLAGE_h
#define ANLAGE_h
class ANLAGE : public QTreeWidgetItem {


wenn ich ein compiler wahre und define ANLAGE_h bekomme und die class name auch ANLAGE haette ich auch probleme...

make distclean [enter] putzen!

class name AnlageQTreeWidgetItem /* damit ich begreife was es ist! */

#ifndef ANLAGEQTREEWIDGETITEM_H
#define ANLAGEQTREEWIDGETITEM_H

dateiname alles kleischreiben lovercase **.h **.cpp

mit #include <QPointer> arbeiten so das parent automatisch immer null (0) ist tool http://ppk.ciz.ch/qt_c++/qt/res.html oder template anschauen http://ppk.ciz.ch/qt_c++/qt/subClass_cpp.txt http://ppk.ciz.ch/qt_c++/qt/subClass_h.txt

da ich auch zu faul bin zu schreiben lasse ich mich mit dem tool alles vorschreiben...

dann classname::self( this )->exec();
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QTreeWidgetItem ist nicht von QObject abgeleitet, also auch kein Q_OBJECT
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

danke euch beiden.
@christian81: das hatte ich übersehen, das wirds wohl sein.
@patrik: das mit dem QPointer klingt gut. Muss gestehen, dass ich mir das Gerippe der Klasse einfach von Qt4DS erstellen lasse.
Im Falle der Klasse Anlage gibts aber natürlich keine Factoryfunktion, aber ich werds bei den anderen Klassen verwenden

@all:
jetzt bin ich noch hilfloser: der Compiler bemängelt, dass er QString, QMap und QVariant nicht findet. Zum Einen hat er es früher bei der Datei gefunden, zum Anderen ist es echt strange, dass er dann QTreeWidgetItem findet - das wird ja zuerst inkludiert und gibt keine Fehlermeldung. Hat da jemand einen Tipp?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

mikro hat geschrieben: jetzt bin ich noch hilfloser: der Compiler bemängelt, dass er QString, QMap und QVariant nicht findet. Zum Einen hat er es früher bei der Datei gefunden, zum Anderen ist es echt strange, dass er dann QTreeWidgetItem findet - das wird ja zuerst inkludiert und gibt keine Fehlermeldung. Hat da jemand einen Tipp?
QString suche im assistant sagt... immer links oben...
#include <QString>
QMap suche im ....
#include <QMap>
QVariant suche im ....
#include <QVariant> u.n.s.w.....
wenn sie gelinkt sind und der compiler immer noch mekkert ... dann ist error zeile ** am zug....
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

mikro hat geschrieben: @patrik: das mit dem QPointer klingt gut. Muss gestehen, dass ich mir das Gerippe der Klasse einfach von Qt4DS erstellen lasse.
dann clicke About im Qt4DS ... http://qt4ds-monkey.sourceforge.net und unter tester findest du mein namen in der neue version ... die gerippe die du meinst sind die selbe.... von http://ppk.ciz.ch/qt_c++/qt/ und Qt4DS ..... ich habe die Italienische version uebersetzt.... :D
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

patrik08 hat geschrieben: QString suche im assistant sagt... immer links oben...
#include <QString> u.n.s.w.....
Sorry, aber da versteh ich Dich gar nicht. Meinst Du ich soll die Zeile
#include <QString>
einfügen? habe ich doch. das ist nach wie vor die Klasse, die weiter oben steht. Er bemängelt ja genau die Zeile in der ich versuche QString zu inkludieren, und das nachdem er eine Zeile weiter oben ohne Probleme QTreeWidgetItem inkludiert hat.
patrik08 hat geschrieben:wenn sie gelinkt sind und der compiler immer noch mekkert ... dann ist error zeile ** am zug....
?? da sind nicht mehr errorzeilen. Ich kriege nur:

Code: Alles auswählen

ANLAGE.h:13:19: QString: No such file or directory
ANLAGE.h:14:16: QMap: No such file or directory
ANLAGE.h:15:20: QVariant: No such file or directory
mingw32-make[1]: *** [debug\ANLAGE.o] Error 1
mingw32-make[1]: Leaving directory `C:/cproj/WERTer'
mingw32-make: *** [debug] Error 2
dabei habe ich in der .pro schon warn_on.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

mikro hat geschrieben: ?? da sind nicht mehr errorzeilen. Ich kriege nur:

Code: Alles auswählen

ANLAGE.h:13:19: QString: No such file or directory
ANLAGE.h:14:16: QMap: No such file or directory
ANLAGE.h:15:20: QVariant: No such file or directory
mingw32-make[1]: *** [debug\ANLAGE.o] Error 1
mingw32-make[1]: Leaving directory `C:/cproj/WERTer'
mingw32-make: *** [debug] Error 2
dabei habe ich in der .pro schon warn_on.
na .... dann poste mal zeile 10 bis 20 vom file ANLAGE.h ...
brauchts du QVariant? ... aus der doku ist nicht sofort ersichtlich was qvariant ist... ist es so wie ein struct? oder wass ist das?
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

patrik08 hat geschrieben: na .... dann poste mal zeile 10 bis 20 vom file ANLAGE.h ...
brauchts du QVariant? ... aus der doku ist nicht sofort ersichtlich was qvariant ist... ist es so wie ein struct? oder wass ist das?[/quote]

Code: Alles auswählen

12 #include <QTreeWidgetItem>
13 #include <QString>
14 #include <QMap>
15 #include <QVariant>
ich habe auch gerade nochmal versucht ein anderes projekt zu kompiliern - das lief (und ja, ich habe vorher ein make clean gemacht). Also an den grundsätzlichen Einstellungen sollte es eigentlich auch nicht liegen.

QVariant ermöglicht es verschiedene Typen in einer Variable zu speichern. ich verwende ein QMap<QString,QVariant> um eine Mischung von QString/int/Float-Werten zu speichern.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

mikro hat geschrieben:

Code: Alles auswählen

12 #include <QTreeWidgetItem>
13 #include <QString>
14 #include <QMap>
15 #include <QVariant>
probiere noch
#include <QtGui>

Ausser den linen zahlen /// ist alles richtig... (ausser qt3 oder 2 version die machen es noch mal anders.... )
und den file name ... ANLAGE.h habe ich noch niee gemacht...

alles gross schreiben ??? bis heute habe ich so viele..... source file gesehen
um auch etwas zu lernen ... aber die file name alles gross ist fuer mich neu...


wenn die header datei so ist...

#ifndef GUI_ABOUT_H
#define GUI_ABOUT_H
code ******
#endif // GUI_ABOUT_H

und die source file
#include "gui_about.h"

gehe ich in der annahme das header und compiler wissen das GUI_ABOUT_H und gui_about.cpp irgenwie zusammenpassen aber wenn ein wenig klein und gross gemixt vorkommt habe ich keine ahnung was passiert...
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

also gut, hab jetzt sämtliche Dateien umbenannt und bei der Gelegenheit gleich mal in Unterverzeichnisse aufgeräumt - jetzt habe ich erst mal genügend Probleme damit die dazu zu bringen, dass sie sich gegenseitig wieder finden *seufz*
Irgendwie schwant mir, dass das mit dem inkludieren wieder deswegen nicht geklappt hat, weil in der .pro -Datei dank Qt4DS wieder
INCLUDE = .
anstatt
INCLUDE += .
stand. Laut dem Entwickler von Qt4DS müsste es auch mit
INCLUDE = .
gehen und irgendwas liegt mit meiner Konfiguration wohl noch im Argen. Ich bin mir aber sicher, dass ich ursprünglich die .pro geprüft hatte - irgendwann in den letzten Tagen hab ich wohl gleichzeitig das ursprüngliche Problem gelöst und die .pro-Datei von Qt4DS neu schreiben lassen *aarghs*
Besten Dank euch auf jeden Fall schon mal.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

arbeitest du mit subversion [ http://subversion.tigris.org/ ] oder cvs [ http://www.nongnu.org/cvs/ ] ... oder weder noch?
( die versionierung der source software ) ....
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

ab jetzt arbeite ich mit subversion *stolz-selbst-auf-die-Schulter-klopf*
die Probleme die ich erwähnte, dass ich die Dateien dazu bringen musste sich gegenseitig wiederzufinden waren mehr der Art, dass die ui_Mainwindow.h jetzt zum Beispiel in einem unterverzeichnis /build/.ui erzeugt wird und ich dachte ich müsste diesen relativen Pfad mit ins include aufnehmen.

Jetzt wo alles soweit funktioniert habe ich mich gerade mal soweit in subversion eingelesen, dass ich das auf dem linux-server hier im büro mit webdav über https nutzen kann. Nachdem der https Zugriffe nicht übers internet, wohl aber durch einen openvpn-tunnel von mir daheim aus ermöglicht, kann ich jetzt also ganz entspannt weiterbasteln ;)
Zuletzt geändert von mikro am 7. Mai 2006 21:49, insgesamt 1-mal geändert.
Antworten