Seite 1 von 2

[gelöst]Wieso wird "resizeEvent" nicht angesprunge

Verfasst: 8. Juni 2009 20:53
von JoseMan
Hi,

ich habe mal wieder ein Problem....!
Ich habe ein Widget, welches ich von QWidget geerbt habe.
Ich habe es per QTDesigner erstellt, besser gesagt habe ich die Vorlage von "upsala" (danke nochmal) an ein MainWindow geändert.
Ich habe es per QTDesigner so erstellt, dass wenn ich die größe des MainWindows ändere, sich die Elemente darin ändern, also verankert.

Jedoch wenn ich mal den Debugger "anhaue" dann wird da beim Größer, oder Kleiner Ziehen des Fensters nicht in die "resizeEvent" Methode gesprungen...!

Gibt es da etwas zu beachten?
Kann mir jemand helfen?

Bye ..-..

Verfasst: 8. Juni 2009 21:00
von upsala
Falsches Widget üerladen?
An falsches Widget den Event-Filter angehängt?
Funktion/Parameter falsch geschrieben.

Verfasst: 8. Juni 2009 21:05
von JoseMan
Falsches Widget üerladen?
Denke nicht!
An falsches Widget den Event-Filter angehängt?
Ok, das weis ich nicht. Wie kann ich mich da vergewissern?
Funktion/Parameter falsch geschrieben.
Nein!

Verfasst: 8. Juni 2009 21:35
von JoseMan
Ok, ich habe eben mitbekommen, durch debuggen, das auch die Methode "minimumSizeHint" nich angesprungen wird, aber z.B. "timerEvent" oder "paintEvent" schon??

Verstehe ich nicht.

Verfasst: 8. Juni 2009 22:05
von JoseMan
So, vielleicht kann mir hiermit jemand einen Tipp geben:

Folgendes:

Code: Alles auswählen

MyWidget::MyWidget(QWidget* parent)
: QWidget(parent)
{
	int w(parent->width());
	int h(parent->height());
}
liefert etwas anderes als das hier:

Code: Alles auswählen

MyWidget::MyWidget(QWidget* parent)
: QWidget(parent)
{
	int w(width());
	int h(height());
}
Wie kann das sein?
Hab ich ein Brett vorm Kopf?
:(

Verfasst: 8. Juni 2009 22:07
von upsala
Das eine ist die Größe deines Widgets, die andere Größe ist die deines parents.

Verfasst: 8. Juni 2009 22:11
von JoseMan
Aaahh, okay. Da komme ich doch der Sache langsam näher.

Also das "parent"-Widget ist jenes, welches ich gerne überladen möchte.
Also dort auf den Resize-Event, und so, reagieren.
Ich kapiere es nicht!! :oops: :evil: :oops:

Verfasst: 8. Juni 2009 23:48
von JoseMan
Okay, hier mal der gesamte Code (vereinfacht):

Code: Alles auswählen

class MainQTWindow : public QMainWindow,Ui::MainWindow
{
public:
	MainQTWindow(QWidget* parent=0);
	~MainQTWindow(void);
	QWidget* getRenderWidget();

};
"getRenderWidget()" liefert einen "QWidget" zurück, indem ich zeichnen möchte.

Hier die Headerdatei:

Code: Alles auswählen

class MyRenderWidget : public QWidget
{
public:
	MyRenderWidget(QWidget* parent);
	~MyRenderWidget(void);

	void resizeEvent(QResizeEvent* e);

};
Hier die Cpp-datei:

Code: Alles auswählen

MyRenderWidget::MyRenderWidget(QWidget* parent)
: QWidget(parent)
{
}

MyRenderWidget::~MyRenderWidget(void)
{
}

void MyRenderWidget::resizeEvent(QResizeEvent* e)
{
	int test(1001);
}
"int test(1001)" habe ich zu debugg-Zwecken geschrieben.

Die Main.cpp datei:

Code: Alles auswählen

int _tmain(int argc, _TCHAR* argv[])
{
	QApplication app(argc, argv);
	app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));

	MainQTWindow mainWindow;
	MyRenderWidget widget(mainWindow.getRenderWidget());

	mainWindow.show();

	return app.exec();
}
Wenn ich nun ein Breakpoint in die "resizeEvent"-Methode setze, wird der nie angesprungen.

Was mache ich falsch??
Danke für jeden Tipp.

Verfasst: 9. Juni 2009 08:05
von franzf
Und wo steht bei dir das "Q_OBJECT" im Header?

Verfasst: 9. Juni 2009 09:07
von JoseMan
franzf hat geschrieben:Und wo steht bei dir das "Q_OBJECT" im Header?
Ich dachte ich benötige "Q_OBJECT" nur wenn ich mit Signalen arbeite?
Kann das der Fehler sein?

Verfasst: 9. Juni 2009 09:24
von Christian81
Das mit Q_OBJECT ist korrekt

Aber MyRenderWidget wird nirgends angezeigt - warum sollte dann also ein resizeEvent dafür kommen?

Verfasst: 9. Juni 2009 09:46
von JoseMan
Aha, okay.... leider bin ich im Moment nicht dahaim um das zu testen,
aber:

Code: Alles auswählen

MainQTWindow mainWindow;
MyRenderWidget widget(mainWindow.getRenderWidget());

widget.show();  ///<---- !!!!

mainWindow.show();
?? :oops:

Verfasst: 9. Juni 2009 10:01
von franzf
das widget.show() steht in deinem oberen Beitrag nicht.
Und

Code: Alles auswählen

MyRenderWidget widget(mainWindow.getRenderWidget());
Erstellt ein MyRenderWidget mit mainWindow.getRenderWidget() als parent!
Wenn dann das MyRenderWidget in keinem Layout liegt - weshalb sollte es bei einem resize des parent ein resizeEvent empfangen?
Und anstatt einer Zuweisung im resizeEvent (in test(1001)) wäre sicherlich zum schnellen sehen ein qDebug() << "MyRenderWidget::resizeEVent()"; nicht schlecht. Sieht man schneller als mit dem Debugger.

Verfasst: 9. Juni 2009 11:03
von JoseMan
Nein, das

Code: Alles auswählen

widget.show();
habe ich hinzugefügt. Es sollte eine Frage sein.

ok, was ich da mit "mainWindow.getRenderWidget()" zurück bekomme ist in einem Layout. Ich möchte eben für dieses QWidget (*::getRenderWidget()) die "resizeEvent()"-Methode überschrieben!

Verfasst: 9. Juni 2009 11:46
von franzf
Du kannst dich in das resizeEvent einhängen (per eventFilter) aber nicht von außen überschreiben. Das machst du bitte in einer eigenen abgeleiteten Klasse.
Und auch wenn das parent in einem Layout hängt - dein MyRenderWidget-Objekt aus main() tut es nicht. Und genau darum geht es. Sende doch einfach deinem widget ein freundliches resize..

Code: Alles auswählen

widget.resize(100, 200);
Dann hast du dein angesprungenes reizeEvent().

Oder setze endlich einen eventfilter auf das parentWidget() im Konstruktor und implementier eventFilter() in MyRenderWidget. Da kannst du dann resizen wie es dein parent vorgibt.

Grüße
Franz