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
Rückgabe von Werten in ein Widget
-
ArneStocker
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
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 :
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
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.
Dieses Event wird dann erzeugt und an das Fenster gesendet, dessen virtuelle event Methode Du überlagern musst.
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
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");2. Du definierst für Dein Subwidget eine Methode
Code: Alles auswählen
void SubWidget::SetText("blabla")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;
}
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);
}
Ich hoffe, ich haben nicht an Deinem Problem vorbei geredet
Gruss Arne
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.
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.
-
ArneStocker
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
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
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