[gelöst] dynamic/qobject_cast (Zugriff auf Laufzeit-Element)

Alles rund um die Programmierung mit Qt
Antworten
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

[gelöst] dynamic/qobject_cast (Zugriff auf Laufzeit-Element)

Beitrag von s-valve »

:?:
Hallo,

ich habe eine Klasse implementiert, welche auf einem QTabWidget basiert, dem zur Laufzeit je neuer Seite ein Splitter mit zwei Textfeldern hinzugefügt werden kann. Der entsprechende SLOT sieht folgendermaßen aus:

Code: Alles auswählen

void PageCtrl::newPage()
{ //create a new page
  QSplitter *splitter = new QSplitter(this);
  QTextEdit *TE1      = new QTextEdit(splitter);
  QTextEdit *TE2      = new QTextEdit(splitter);
  addTab(splitter, tr("untitled"));
}
Nun möchte ich zum speichern der Textfelder der gerade aktivierten Seite des QTabWidget wieder auf diese zugreifen können. Auf den Splitter der aktiven Seite zu zugreifen war recht einfach

Code: Alles auswählen

 QSplitter *splitter1 = qobject_cast<QSplitter *>(this->currentWidget());
Aber nun komme ich nicht weiter bei dem separaten Zugriff auf die beiden Textfelder.
Den Code hatte ich schon mal unter Borland C++ geschrieben. Dort war es recht einfach mit den Zugriffen über das direkte Ansprechen der Komponenten auf dem PageControl-Element:
TRichEdit* tmpRE1 = dynamic_cast<TRichEdit*>(PageControl1->ActivePage->Components[5]);
TRichEdit* tmpRE2 = dynamic_cast<TRichEdit*>(PageControl1->ActivePage->Components[7]);

Ich habe schon einiges ausprobiert, sehe jetzt wohl aber den Wald vor lauter Bäumen nicht mehr. Die Forensuche habe ich auch schon bemüht, aber im gefundenen Beitrag ging es nur um je ein Element. Also sorry, falls der Beitrag anzuecken scheint.
Vlt. kann mir ja jemand von euch den entscheidenden Tipp geben. Danke im Voraus.

Gruß,
M
Zuletzt geändert von s-valve am 13. Mai 2007 12:39, insgesamt 1-mal geändert.
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

[gelöst] dynamic/qobject_cast (Zugriff auf Laufzeit-Element)

Beitrag von s-valve »

Habe noc hmal die Qt-Referenz durchforstet und mal alles gründlich gelesen :wink:

Code: Alles auswählen

void PageCtrl::insertText()
{ //insert text test fcn.
  QSplitter *splitter1 = qobject_cast<QSplitter *>(this->currentWidget());
  QTextEdit *TE1 = qobject_cast<QTextEdit *>(splitter1->widget(0));
  QTextEdit *TE2 = qobject_cast<QTextEdit *>(splitter1->widget(1));
    
  TE1->append(tr("test of.."));
  TE2->append(tr("..qobject_cast"));
}
Allerdings wäre es nett eine Zeile noch einsparen zu können, aber leider funktioniert dies hier nicht, da widget angeblich kein member von QWidget ist.

Code: Alles auswählen

QTextEdit *TE1 = qobject_cast<QTextEdit *>(this->currentWidget()->widget(0));

//------------------------------------
//Klassendeklaration
class PageCtrl : public QTabWidget
{
    Q_OBJECT

public:
    PageCtrl(QWidget *parent = 0);

//Klassendefinition
PageCtrl::PageCtrl(QWidget *parent)
    : QTabWidget(parent)
{
}
Jedenfalls geht's erst mal so.

edit:
Jupp findChild ist mir auch aufgefallen. Gebe der Funktion auch erst mal den Vorzug.

Code: Alles auswählen

QTextEdit *TE1      = new QTextEdit(splitter); 
TE1->setObjectName("Text1"); 
...  
QTextEdit *TE1 = this->currentWidget()->findChild<QTextEdit*>("Text1");
Gruß,
M
Zuletzt geändert von s-valve am 13. Mai 2007 16:20, insgesamt 2-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Gib deinen Textfeldern Objectnamen und mach es damit

Code: Alles auswählen

T QObject::findChild ( const QString & name = QString() ) const
Antworten