Klasse von ui_KLasse ableiten (Single Inheritance Approach)

Alles rund um die Programmierung mit Qt
Antworten
autip
Beiträge: 14
Registriert: 24. Januar 2006 18:05

Klasse von ui_KLasse ableiten (Single Inheritance Approach)

Beitrag von autip »

Hallo!

Ich bin zurzeit dabei, mich in Qt 4 einzuarbeiten.

Als erstes habe ich mit dem Dessigner ein Widget erstellt, als ui-File gespeichert, über das Plugin in Microsoft Visual C++ importiert und mit der "Direct Approach" in mein Programm eingebunden.
Das hat soweit alles Funktioniert.

Nun möchte ich aber zusätzlichen Code aufsetzen.

Wie ich gelesen habe konnte man das in Qt 3 noch in einem Code-Editor machen. Ist das in Qt 4 nicht mehr möglich? Ich hab die Funktion zumindest nicht gefunden.

Egal, die Klassenableitung "Single Inheritance Approach" ist mir eh lieber.




Nun zu meinem Problem:
Mit dem bekannten Ansatz kann ich die Klasse leider nicht Ableiten! Ich erhalte immer Fehlermeldungen. Was mach ich falsch?

Hier mal die Auszüge aus den Dateien:

Die kompilierte ui-Datei "Ui_IOPlugin_Widget.h"

Code: Alles auswählen

#ifndef UI_IOPLUGIN_WIDGET_H
#define UI_IOPLUGIN_WIDGET_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QLCDNumber>
#include <QtGui/QLabel>
#include <QtGui/QSpacerItem>
#include <QtGui/QSpinBox>
#include <QtGui/QTextBrowser>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

class Ui_IOWidget
{
…   
//DAS HAB ICH MAL GEKÜRZT
…
};

namespace Ui {
    class IOWidget: public Ui_IOWidget {};
} // namespace Ui

#endif // UI_IOPLUGIN_WIDGET_H


Um die Klasse Abzuleiten habe ich laut diverser Quellen eine .h und .cpp-Datei erstellt:

SingleInheritance.h

Code: Alles auswählen

#ifndef SINGLE_INHERITANCE_H
#define SINGLE_INHERITANCE_H

#include "../generated/ui_IOPlugin_Widget.h"


class MyClass : public Ui_IOWidget
{
    Q_OBJECT
public:
    MyClass(QWidget* parent=0, const char* name=0);
};
#endif


SingleInheritance.cpp

Code: Alles auswählen

#include "Single_Inheritance.h"
#include <QApplication>
#include <QDialog>

MyClass::MyClass(QWidget* parent, const char* name) : Ui_IOWidget(parent, name)
{
}

Beim kompilieren bekomme ich den folgenden Fehler:
...\Single_Inheritance.cpp( 78 ) : error C2661: 'Ui_IOWidget::Ui_IOWidget' : no overloaded function takes 2 parameters



Wenn ich die ganzen "name"s aus den Klammern entfern lautet der Fehler
...\single_inheritance.cpp( 78 ) : error C2664: '__thiscall Ui_IOWidget::Ui_IOWidget(const class Ui_IOWidget &)' : cannot convert parameter 1 from 'class QWidget *' to 'const class Ui_IOWidget &'
Reason: cannot convert from 'class QWidget *' to 'const class Ui_IOWidget'
No constructor could take the source type, or constructor overload resolution was ambiguous
Error executing cl.exe.



Ausserdem hab ich mal statt
"class MyClass : public Ui_IOWidget"
die Zeile
class MyClass : public IOWidget

oder auch
class MyClass : public QWidget
eingefügt, weil ich mir nicht sicher bin was dort hin gehört, aber alles ohne Erfolg.

Was muss ich ändern?

Danke schon mal für eure Hilfe!!!
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

Beitrag von methusalem »

Ich habe es so gemacht:

Code: Alles auswählen

#ifndef MODULTEST_H
#define MODULTEST_H
#include <ui_modultest.h>

class Modultest : public QDialog, private Ui::Modultest { 
Q_OBJECT

public:
	Modultest(QWidget *parent = 0);
protected:
private slots:
private:
};
#endif
Wobei bei mir ui_modultest.h die von make generierte Headerdatei ist die aus der modultest.ui generiert wurde. Das funktioniert bei mir wunderbar mit allen möglichen GUIs
Martin
Kris
Beiträge: 8
Registriert: 18. Januar 2006 09:05
Wohnort: Oldenburg

Re: Klasse von ui_KLasse ableiten (Single Inheritance Approa

Beitrag von Kris »

autip hat geschrieben:Hallo!

...

Nun zu meinem Problem:
Mit dem bekannten Ansatz kann ich die Klasse leider nicht Ableiten! Ich erhalte immer Fehlermeldungen. Was mach ich falsch?

Hier mal die Auszüge aus den Dateien:

Die kompilierte ui-Datei "Ui_IOPlugin_Widget.h"

Code: Alles auswählen

#ifndef UI_IOPLUGIN_WIDGET_H
#define UI_IOPLUGIN_WIDGET_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QLCDNumber>
#include <QtGui/QLabel>
#include <QtGui/QSpacerItem>
#include <QtGui/QSpinBox>
#include <QtGui/QTextBrowser>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

class Ui_IOWidget
{
…   
//DAS HAB ICH MAL GEKÜRZT
…
};

namespace Ui {
    class IOWidget: public Ui_IOWidget {};
} // namespace Ui

#endif // UI_IOPLUGIN_WIDGET_H


Um die Klasse Abzuleiten habe ich laut diverser Quellen eine .h und .cpp-Datei erstellt:

SingleInheritance.h
...

Beim kompilieren bekomme ich den folgenden Fehler:
...\Single_Inheritance.cpp( 78 ) : error C2661: 'Ui_IOWidget::Ui_IOWidget' : no overloaded function takes 2 parameters

...

Ausserdem hab ich mal statt
"class MyClass : public Ui_IOWidget"
die Zeile
class MyClass : public IOWidget

oder auch
class MyClass : public QWidget
eingefügt, weil ich mir nicht sicher bin was dort hin gehört, aber alles ohne Erfolg.

Was muss ich ändern?

Danke schon mal für eure Hilfe!!!
MyWidget.h :

Code: Alles auswählen

#include "Ui_IOPlugin_Widget.h"
#include <QWidget>

class MyWidget : public QWidget {
   Q_OBJECT
   public:
   MyWidget( QWidget *parent = 0 );
   private:
   Ui::IOWidget iowidget;
}
MyWidget.cpp

Code: Alles auswählen

#include "mywidget.h"
MyWidget::MyWidget( QWidget *parent ) : QWidget( parent )
{
   iowidget.setupUi( this );
   ...
}
MyWidget wird abgelitten entsprechend der Klasse des erstellten Widgets,
also wenn Du einen Dialog erstellst, dann von QDialog,
wenn ein Widget, dann von QWidget.

Siehe auch
http://doc.trolltech.com/4.1/designer-u ... e-approach

Abgesehen davon nehmen die von QObject abgelittenen Klassen nur noch
den "*parent" als Parameter.
Wenn Du einen Namen mitgeben willst, dann so :

Code: Alles auswählen

MyWidget::MyWidget( QWidget *parent, const QString& name ) : QWidget( parent )
{
   iowidget.setupUi( this );
   setObjectName( name );
   ...
}
Siehe :
http://doc.trolltech.com/4.1/qt4-intro. ... nstructors

Der Blick in den "assistant" empfiehlt sich eben doch manchmal
(SCNR) :wink:


HTH,
Gruß,
Kris
methusalem
Beiträge: 186
Registriert: 11. August 2005 08:21

Beitrag von methusalem »

Moin,

jaja, wer lesen kann ist klar im Vorteil! Asche auf mein Haupt. Ich hatte den Betreff des Posts nicht richtig gelesen.

Das was ich gemacht habe ist "Multiple Inheritance Approach" und nicht "Single Inheritance Approach". Beide Wege sind möglich. Ich denke es ist Geschmakssache ...
Martin
Kris
Beiträge: 8
Registriert: 18. Januar 2006 09:05
Wohnort: Oldenburg

Beitrag von Kris »

methusalem hat geschrieben:Moin,

Das was ich gemacht habe ist "Multiple Inheritance Approach" und nicht "Single Inheritance Approach". Beide Wege sind möglich. Ich denke es ist Geschmakssache ...
Nö, ist es nicht.
Beim MIA hast Du unmittelbaren Zugriff auf die Member-Widgets, die
der Designer erzeugt. Beim SIA hast Du den nicht, da musst Du über
den angelegten Ui::fooWidget auf die Dinger zugreifen.
Dafür kannst Du Dir aber ein paar Widgets in Deine Klasse
einbauen, also z. B.

Code: Alles auswählen

class foobar : public QWidget
{
   public:
   foobar( QWidget *parent = 0, int mode );
   ...
   private:
   Ui::fooWidget foo;
   Ui::barWidget bar
};

foobar:foobar( QWidget *parent, int mode ) : QWidget( parent )
{
   if ( 1 == mode )
      foo.setupUi( this );
   else
      bar.setupUi( this );
}
Das geht beim MIA nicht, obwohl ich ihn ehrlich gesagt meist praktischer finde.

Gruß,
Kris
autip
Beiträge: 14
Registriert: 24. Januar 2006 18:05

Beitrag von autip »

Danke für eure schnelle Hilfe!!!

Hab diese Variante natürlich gleich ausprobiert. Leider erhalte ich wiederum Fehlermeldungen, die ich nicht deuten kann:
Linking...
Creating library Debug/NewPlugin.lib and object Debug/NewPlugin.exp
Single_Inheritance.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MyWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
Single_Inheritance.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall MyWidget::qt_metacast(char const *)" (?qt_metacast@MyWidget@@UAEPAXPBD@Z)
Single_Inheritance.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall MyWidget::metaObject(void)const " (?metaObject@MyWidget@@UBEPBUQMetaObject@@XZ)
../../../../.../NewPlugin.dll : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

NewPlugin.dll - 4 error(s), 0 warning(s)
Und nun?
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

Dein Fehler sieht so aus als hättest du vergessen deinen Header durch den MOC laufen zu lassen, dieses File dann zu kompilieren, oder es zu deinem Programm zu linken.

Solltest du qmake benutzen, schau mal, ob dein Header bei HEADERS angegeben ist, sonst einfach

Code: Alles auswählen

HEADERS += Single_Inheritance.h
...oder wie auch immer dein Header bennant ist.

mfg
uhu01
autip
Beiträge: 14
Registriert: 24. Januar 2006 18:05

Beitrag von autip »

Ja genau, ich wusste das mit dem moc noch nicht.
Hab das Problem gestern Abend behoben und wollte euch nun davon Berichten dass ich die Lösung gefunden habe. Aber du warst schneller ;)

Ich möcht mich aber nochmals für die schnelle Hilfe von allen Bedanken! Ist echt ein super Forum!!! Macht weiter so!
Antworten