Seite 1 von 1

Rückgabe von Werten in ein Widget

Verfasst: 17. November 2004 11:10
von Karsten
Hi@all,

habe folgendes Problem.
habe ein Main Widget welches über eine Klasse subwidgets lädt.
nachdem nun die subwidgets im mainwidget angezeigt werden, kann man über einen Button einen Wizard öffnen in dem Werte die in den Subwidgtes angezeigt werden geändert werden können. Nach einem Klick auf einen Button "Fertigstellen" werden die geänderten werte an die klasse des main widget zurückgegeben. Nun hab ich das Problem, wie setz ich die geänderten Werte nun in der Klasse mit den Subwidgets, so dass Sie mir auch angezeigt werden. Z.Anm. die Subwidgets zeigen die Werte über QLabels an und diese werden mit setText() gesetzt.

Gruß Karsten

Verfasst: 17. November 2004 14:54
von ArneStocker
Hallo Karsten

es gibt mehrere Möglichkeiten

1. Du merkst Dir den Zeiger des SubWidget in Deinem MainWidget (z.B. als Membervariable QSubWidget *m_pSubWidget) und setzt dann direkt den Wert :

Code: Alles auswählen

m_pSubWidget->TextLabel->setText("blabla");
das ist allerdings nicht sehr OO Konform und kann Dir bei späteren Änderungen des Quellcodes unnötige Seiteneffekte und Mehrarbeit bedeuten

2. Du definierst für Dein Subwidget eine Methode

Code: Alles auswählen

void SubWidget::SetText("blabla")
3. Wenn Du den Typ Deines Subwidget u.U. noch nicht kennst oder ggf. gar nicht weist, welches Deiner Fenster zur Laufzeit mit der Nachricht etwas anfangen kann, kannst Du auch ein Ereignis erzeugen und an das (jedes) Fenster senden.

Das Ereignis leitest Du von QCustomEvent ab (siehe die Doku) und gibst ihm eine Membervariable QString m_customText mit.

Code: Alles auswählen

class MyXTextEvent : public QCustomEvent
{
	public : 
		enum {Type XTextEvent = 1001};

	public:
		MyXTextEvent();
		virtual ~MyXTextEvent();

	public:
		SetText(QString bla);
		QString GetText();

	protected:
		QString m_customText;
}
Dieses Event wird dann erzeugt und an das Fenster gesendet, dessen virtuelle event Methode Du überlagern musst.

Code: Alles auswählen

MyXTextEvent textEvent;
textEvent.setText("blabla");	
if (qApp->sendEvent(pIrgendEinWidget,&textEvent) == true)
{
	.. Fenster hat event verarbeitet ...
}
	
bool SubWidget::event(QEvent *pEvent)
{
	// Event prüfen

	if (pEvent->type() == MyXTextEvent::XTextEvent)
	{
		MyXTextEvent *pTextEvent = (MyXTextEvent*)pEvent;
		TextLabel->setText(pTextEvent->GetText());
		return true;
	}
	return QWidget::event(pEvent);
}
Wenn Du das Event wie hier auf dem Stack erzeugst, solltest Du immer die Methode SendEvent verwenden. Ereignisse die Du mit PostEvent in die MessageQueue setzen möchtest, musst Du auf dem Heap erzeugen, es wird dann automatisch ein delete aufgerufen.

Ich hoffe, ich haben nicht an Deinem Problem vorbei geredet

Gruss Arne

Verfasst: 18. November 2004 10:00
von Karsten
also die ganze sache läuft nun so ab, die geänderten Werte werden vom Wizard an das MainWidget zurückgegeben, dann wird eine Methode aufgerufen, welche das Datenobjekt in der Klasse der SubWidgets updatet,.
Nur sind nun in dieser Klasse die Labels an die die geänderten Daten ausgegeben werden sollen tot.
Zuerst habe ich ja gedacht, das läge daran, das die Labels in einer createWidget - Methode initialisiert werden und nach verlassen dieser Ihre Gültigkeit verlieren. Jetzt habe ich die Labels im Konstruktor der Klasse initialisiert und die Labels sind in der update methode doch gestorben.
Warum sterben die labels, das Objekt wird ja die ganze nicht beendet und es werden nirgendwo delete ausgeführt.

Verfasst: 18. November 2004 13:54
von gandalf
Hallo, kannst Du mal den Code zeigen vieleicht ist dort ersichtlich wo dein Problem liegt, bei Qt muß man sich bei widgets nicht um delete kümmern da widegts das in der Regel selber tun. Bitte zeige auch deine .h

gandalf

Verfasst: 18. November 2004 18:46
von ArneStocker
Also unter 'tot' und 'sterben' kann ich mir nichts rechtes vorstellen. Entweder ist da am Ende Deines Zeigers ein QLabel - Objekt oder nicht (dann dürfte das Programm an dieser Stelle zu ende sein). Oder reagiert es bloss nicht so, wie Du es wünscht ?

Wie erzeugst Du Dein SubWidget, zu Fuss oder im QT Designer. Wenn Du es zu Fuss erzeugst, dann zeige doch bitte mal den betreffende Programmcode.

Wenn Du es im QT-Designer erzeugst, gibst Du üblicherweise jedem Objekt (QLabel, QEditLine, QComboBox usw) einen Namen, über den Du während der gesamten Lebensdauer des Subwidget auf die Objekte zugreifen kannst.

Gruss Arne