Seite 1 von 1

Von Widget erben

Verfasst: 13. März 2012 12:15
von rubikon
Hallo.

Ich habe ein eignes Widget erstellt, welches eine pure virtual Funktion, einen pure virtual privaten Slot und einen virtual privaten Slot zum überscheiben haben soll:

Code: Alles auswählen

class ClassA : public QWidget
{
    Q_OBJECT

	public:
		explicit ClassA(QWidget *parent = 0);
		virtual void fkt1() = 0;
	
	private slots:
		virtual void pushButtonOkClicked();
		virtual void pushButtonCloseClicked() = 0;	
}
Nun soll eine Klasse davon erben und die Methoden implementieren bzw. überschreiben. Das habe ich so versucht:

Code: Alles auswählen

class ClassB : public ClassA
{
    Q_OBJECT

	public:
		explicit ClassB(QWidget *parent = 0);
		void fkt1();
	
	private slots:
		void pushButtonOkClicked();
		void pushButtonCloseClicked();	
}

ClassB::ClassB(QWidget *parent) :
	QWidget(parent)
{
}
Nur bekomme ich bekomme ich eine Reihe von Fehlern, angefangen bei
error C2614: 'ClassB': Unzulässige Elementinitialisierung: 'QWidget' ist weder Basis noch Element
Scheinbar mache ich prinzipiell schon was falsch? Wie mache ich es richtig?

Re: Von Widget erben

Verfasst: 13. März 2012 12:27
von franzf
Die Fehlermeldung sagt doch schon alles: QWidget ist keine direkte Basis von ClassB, deshalb hat eine Basisinitialisierung mit QWidget in ClassB nichts zu suchen.
Du willst in ClassB die Basis ClassA initialisieren.

Ansonsten:
pure virtual SLOT ist MMn. keine gute Idee. Mach doch einfach eine normale pure virtual Funktion do_pushButtonCloseClick und einen normalen SLOT pushButtonCloseClick(), in dem du do_pushButtonCloseClick aufrufst.

// kleines Edit:
pure virtual SLOTS funktionieren auf alle Fälle. Ich finds nur etwas komisch. Ich hab schon gegen virtuelle Interfaces eine Abneigung -> NVI (non-virtual interfaces), dann auch noch den Metacompiler + Konsorten und die ganze Magie mit rein ziehen, da stellen sich mir meine Rückenhaare auf :D

Re: Von Widget erben

Verfasst: 13. März 2012 13:55
von rubikon
Hmm... Jetzt jetzt wo ich es sehe ist mir das klar geworden :D

Eine Sache habe ich noch: Nun möchte ich in ClassB auf UI Elemente zugreifen. Dazu habe ich den ui Pointer in CassA unter protected gesetzt, damit er mir in den geerbten Klassen auch zu Verfügung steht. Wenn ich aber nun versuche auf ein UI Element zuzugreifen, sagt er mir:

Code: Alles auswählen

error C2027: Verwendung des undefinierten Typs "Ui::ClassA" 
Wahrscheinlich habe ich wieder Tomaten auf den Augen :oops: