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

Alles rund um die Programmierung mit Qt
Antworten
apfei01
Beiträge: 17
Registriert: 2. Oktober 2005 22:04

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

Beitrag 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.
Dateianhänge
screenshot_Form.png
screenshot_Form.png (6.65 KiB) 2482 mal betrachtet
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
apfei01
Beiträge: 17
Registriert: 2. Oktober 2005 22:04

Beitrag 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.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

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