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

Alles rund um die Programmierung mit Qt
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

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

Beitrag 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 ..-..
Zuletzt geändert von JoseMan am 11. Juni 2009 09:55, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Falsches Widget üerladen?
An falsches Widget den Event-Filter angehängt?
Funktion/Parameter falsch geschrieben.
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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!
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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.
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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?
:(
Zuletzt geändert von JoseMan am 8. Juni 2009 23:56, insgesamt 2-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das eine ist die Größe deines Widgets, die andere Größe ist die deines parents.
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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:
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Und wo steht bei dir das "Q_OBJECT" im Header?
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das mit Q_OBJECT ist korrekt

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Antworten