Seite 1 von 1

Eigenen Button durch Ableiten von QAbstractButton erstellen?

Verfasst: 12. Oktober 2006 15:43
von Mister_Crac
Hallo,

ich möchte einen eigene Button-Klasse erzeugen. Deshalb habe ich eine Klasse MyButton von QAbstractButton abgeleitet. Aber beim Kompilieren gibt es einen Fehler, die Methoden show() und resize() werden anscheinend nicht gefunden. Aber ich dachte, dass QAbstractButton die von QWidget erbt und dass die dann auch in meiner Klasse vorhanden sein müssten? Anscheinend habe ich da noch einen Denkfehler. Hier mal mein Code und darunter die Fehlermeldung.

Datei: MyButton.h

Code: Alles auswählen

#ifndef _MYBUTTON
#define _MYBUTTON
#include <QAbstractButton>

class MyButton : public QAbstractButton
{	
	public:
	MyButton(QWidget *parent=0);
	void paintEvent(QPaintEvent*);
};

#endif
Datei: MyButton.cpp

Code: Alles auswählen

#include "MyButton.h"
#include <QtGui>

MyButton::MyButton(QWidget *parent)
    : QAbstractButton()
{
	setCheckable(true);
}

void MyButton::paintEvent(QPaintEvent*)
{
	QPainter painter(this);
	QRect rectangle(88,63,25,25);
	QPen myPen;
	myPen.setWidth(1);
	myPen.setColor(Qt::black);
	painter.setPen(myPen);
	
	if(isChecked())
	{
		painter.setBrush(Qt::blue);
	}
	else
	{
		painter.setBrush(Qt::red);
	}

	painter.drawEllipse(rectangle);
}
Datei: main.cpp

Code: Alles auswählen

#include "MyButton.h"
#include <QApplication>

int main(int argc, char** argv)
{
	QApplication app(argc, argv);

	MyButton button();
	button.resize(200,150);
	button.show();

	return app.exec();
}
Die Fehlermeldung beim Kompilieren lautet:
main.cpp: In function `int qMain(int, char**)':
main.cpp:9: error: request for member `resize' in `button', which is of non-class type `MyButton ()()'
main.cpp:10: error: request for member `show' in `button', which is of non-class type `MyButton ()()'

Kann mich bitte jemand erleuchten? Das wäre sehr fein :-)

Verfasst: 12. Oktober 2006 15:50
von Mister_Crac
Ah siehe da, ich hab eben was gemerkt. Wenn ich ein Objekt der Klasse MyButton auf dem Heap anlege, also mit new, dann geht es:

Neue Datei main.cpp

Code: Alles auswählen

#include "MyButton.h"
#include <QApplication>

int main(int argc, char** argv)
{
	QApplication app(argc, argv);

	MyButton *button = new MyButton();
	button->resize(200,150);
	button->show();

	return app.exec();
}
Was ich dann aber immer noch nicht verstehe ist, wieso das mit z.B. QPushButton sehr wohl geht. Mit einer Qt-eigenen Klasse würde obiges Beispiel nämlich trotzdem erstmal funktionieren, also ohne new sondern à la "QPushButton button;"
Naja ich sollte mir wohl mal merken, dass man Widget-Objekte immer auf dem Heap anlegt, ne?

Verfasst: 12. Oktober 2006 15:51
von Christian81

Code: Alles auswählen

MyButton button(); 
-->
MyButton button;
So ist es richtig!

Verfasst: 12. Oktober 2006 15:54
von Mister_Crac
Christian81 hat geschrieben:

Code: Alles auswählen

MyButton button(); 
-->
MyButton button;
So ist es richtig!
Äh ja danke. Sorry for being such a noob :oops:

Irgendwas schwirrt mir aber trotzdem im Hinterkopf rum von wegen besser auf dem Heap mit new anlegen...