Seite 1 von 1

[Qt4, Designer] Wie Zugriff auf vom Des. gen. Datei ui_..h?

Verfasst: 9. März 2006 10:56
von apfei01
geschätzte qt-gemeinde,

nach mehreren stunden erfolglosen herumprobierens und suchen geht mein hilfeschrei an euch:

ich habe mittels designer ein widget generiert (besteht aus jeweils zwei qlabel und qlineedit). das programm besteht aus zwei klassen (designer, klasse2). in beiden klassen habe ich setupUi (this) aufgerufen und das vom uic generierte ui_...h inkludiert. von der ersten klasse designer kann ich problemlos auf das widget zugreifen; von der zweiten klasse aus überhaupt nicht. der compilerlauf bringt auch keine fehlermeldung, das programm stürzt auch nicht ab.

meine frage ist folgende: wie kann ich aus verschieden klassen (verschiedenen *.h, *.cpp - dateien) auf ein von designer generiertes widget zugreifen? geht das überhaupt?

folgender beispielcode:

designer.h

Code: Alles auswählen


#include <QtCore>
#include <QtGui>

#include "ui_userinterface.h"
#include "klasse2.h"

class Designer : public QWidget, private Ui::Form {

	Q_OBJECT

	public:
		Designer ();
		~Designer ();

	private:
		Klasse2		*k2;
};

designer.cpp

Code: Alles auswählen


#include "designer.h"

Designer::Designer () : QWidget () {

	setupUi (this);

	label1 -> setText ("Designer");
	lineedit1 -> setText ("12345");

	k2 = new Klasse2 ();

}

Designer::~Designer () { }
klasse2.h

Code: Alles auswählen


#include <QtCore>
#include <QtGui>

# include "ui_userinterface.h"

class Klasse2 : public QWidget, private Ui::Form {

	public:
		Klasse2 ();
		~Klasse2 ();
};
klasse2.cpp

Code: Alles auswählen


#include "klasse2.h"

Klasse2::Klasse2 () : QWidget () {

	setupUi (this);

	label2 -> setText ("Klasse2");
	lineedit2 -> setText ("98765");

}

Klasse2::~Klasse2 () { }

ich habe ein screenshot des programmes angehangen. meine erwartung ist/war, das statt "label" "Klasse2" erscheint, sowie die zahlenfolge "98765" im zweiten qlineedit.

vielen dank für deine/eure hilfe!
gruss,
andy.

Verfasst: 9. März 2006 11:21
von macman
So kann das nicht funktionieren. Deine Designerklasse ist abgeleitet von der Form. Mit setupUi(this) erstellst Du die Form in deiner Designerklasse und greifst dann auf die bestehenden Objekte zu.

Deine Klasse2 ist auch abgeleitet von Form und mit setupUi() erstellst Du jetzt noch eine Form in Klasse2. Klasse2 schreibt also in ganz andere Objekte als die Designerklasse. Du hast zwei Formen, von denen aber nur eine sichtbar ist.

Damit Klasse2 in die Form von der Designerklasse schreiben kann, muss Klasse zwei Zugriff auf die Designerklasse haben. Wie das geht hängt davon ab wie die Klassen instanziiert werden.

Verfasst: 9. März 2006 15:35
von apfei01
hallo macman,

danke für deine antwort, die ich allerdings nur teilweise verstehe (bin in c++ nicht so bewandert und orientiere mich mehr oder weniger an beispielen)
Damit Klasse2 in die Form von der Designerklasse schreiben kann, muss Klasse zwei Zugriff auf die Designerklasse haben. Wie das geht hängt davon ab wie die Klassen instanziiert werden.
so wie ich das jetzt verstehe, muss ich Klasse2 von der Klasse Designer ableiten? oder nur von Ui::Form? wenn ich das mache (setupUi (this) habe ich aus Klasse2 entfernt) dann ist zwar label2 in Klasse2 bekannt, aber der programmaufruf scheitert mit einer speicherzugriffsverletzung.

vielleicht kannst du (oder ein anderer leser in diesem forum) ein kleines code-bsp. für den korrekten zugriff posten?

danke,
andy.

Verfasst: 9. März 2006 16:11
von macman
apfei01 hat geschrieben:orientiere mich mehr oder weniger an beispielen
Na dann los. Qt liefert eine ganze Menge an Beispielen, spiel mit rum.
apfei01 hat geschrieben:so wie ich das jetzt verstehe, muss ich Klasse2 von der Klasse Designer ableiten?
Nein, ganz verkehrt. Mal ein ungefähres Beispiel:

In deiner main.cpp erstellst Du deine Designerklasse:
Designer* dg = new Designer();

Danach hast Du eine Instanz deiner Klasse mit dem Form, Dialog oder was auch immer. Jetzt könntest Du deine Klasse2 erstellen und dem Konstruktor deinen Designer als Parent mitgeben:
Klasse2* kl2 = new Klasse2(dg);

Innerhalb deiner Klasse2 könntest Du dann mit parent() auf die öffentlichen Elemente des Designers zugreifen:
parent()->label2->setText("Klasse2");


Das ist alles etwas vereinfacht, ohne Garantie auf Funktionalität :-)