Rückgabe von Werten in ein Widget

Alles rund um die Programmierung mit Qt
Antworten
Karsten
Beiträge: 9
Registriert: 9. Oktober 2004 15:11
Wohnort: Greven
Kontaktdaten:

Rückgabe von Werten in ein Widget

Beitrag 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
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
Karsten
Beiträge: 9
Registriert: 9. Oktober 2004 15:11
Wohnort: Greven
Kontaktdaten:

Beitrag 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.
gandalf
Beiträge: 39
Registriert: 31. August 2004 17:00
Wohnort: Varel
Kontaktdaten:

Beitrag 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
benutzte QT 3.2 nc auf w2k
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

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