Seite 1 von 1

Zugriff auf Elemente

Verfasst: 11. Januar 2011 15:12
von rvb
Hallo Forum,

ich habe neben meinem mainwindow.ui Formular auch noch ein mywidget.ui Formular in dem ich unter anderen einen QLineEdit names myline habe.
Im mainwindow rufe ich die Funktion auf mit new mywidget und mywidget.show() das zweite Fenster anzeigt. Soweit funktioniert es, nur wie kann ich nun aus dem mainwindow auf das myline zugreifen? Also was mir nicht so ganz klar ist, wie sind die Objekte angeordnet? Auf die Elemente im mainwindow greife ich ja mit ui->pushbutton zu, wie komme ich an die Elemente des zweiten Fensters?

Verfasst: 11. Januar 2011 15:22
von dazedly
Du setzt entweder die externe Klasse als Parent, konvertierst und greifst darüber darauf zu, oder du machst die klasse singleton und holst dir dessen Instanz.

Verfasst: 11. Januar 2011 15:49
von rvb

Code: Alles auswählen

class mywidget : public QWidget
{
    Q_OBJECT

public:
    mywidget(QWidget *parent = 0);

private slots:

private:
    Ui::widged ui;
};
Kannst Du bitte noch erklären wie Du das meinst? Ich hätte angenommen, dass man hier als Parent das mainwindow angeben muss, aber da wüsste ich auch nicht wie.

Verfasst: 11. Januar 2011 15:55
von dazedly
Irgendwo im code schreibst du doch new mywidget()
Im Konstruktor der mywidget klasse hast du den default-wert für parent auf 0 gesetzt. Jetzt kannst du new mywidget(this), oder das Objekt vom parent übergeben, wenn du das "mywidget" Objekt nicht im MainWindow erzeugst.

Verfasst: 11. Januar 2011 16:09
von rvb
Wenn ich das mit "ding = new mywidget(this);" aufrufe, malt er die Elemente des zweiten Fensters mit ins Hauptfenster, das ich eigentlich nicht was ich will. Ich wollte schon zwei getrennte Fenster haben. Mein Problem ist, dass ich nicht an die Daten aus dem QLineEdit rankomme.

Verfasst: 11. Januar 2011 16:26
von dazedly
Dann mach deine MainWindow Klasse singleton:

Beispiel:
Body

Code: Alles auswählen

TestKlasse::TestKlasse()
{
	if ( Server::instance == NULL )
	{
		Server::instance = this;
	}
	else
	{
		throw new std::runtime_error ( "Double initialisation" );
	}
}

QLineEdit* TestKlasse::getBlaEdit()
{
	return this->blaEdit;
}


TestKlasse::~TestKlasse()
{
	this->instance = NULL;
}

TestKlasse* TestKlasse::getInstance ( void )
{
	return instance;
}

TestKlasse* TestKlasse::instance = NULL;
Header

Code: Alles auswählen

#ifndef TESTKLASSE_H
#define TESTKLASSE_H
#include <QMainWindow>
#include <QLineEdit>

class TestKlasse: public QMainWindow
{
		Q_OBJECT

	public:
		TestKlasse();
		static TestKlasse* getInstance ( void );
		~Server();
		QLineEdit * getBlaEdit();
	private:
		static TestKlasse* instance;
		void sendData ( QTcpSocket* socket, RonsPacket* pack );
		QLineEdit *blaEdit;

};

#endif
kannst dir dann mit TestKlasse::getInstance()->getBlaEdit(); nen pointer auf das lineedit holen.

Verfasst: 12. Januar 2011 01:15
von rvb
Sorry, aber ich kann mit dem Beispiel nichts anfangen. Wofür soll z.B das hier sein?
void sendData ( QTcpSocket* socket, RonsPacket* pack );
Ich hab grade versucht rauszufinden, was Singleton ist und bin mir nicht sicher ob es das ist was ich haben will.
Danke trotzdem für die Bemühungen

Verfasst: 12. Januar 2011 08:23
von franzf
Warum denn Singleton?!? Dieses Pattern ist hier absolut unangebracht! Singleton kommt einer globalen Variable gleich, und die sollte man meiden wie die Pest, gibt bei unachtsamer Verwendung einfach zu viele Probleme, in die man laufen kann.

Der Hintergrund der Ausgangsfrage erschließt sich mir auch nicht ganz - was genau ist dein Problem?
1) Wie komme ich an das mywidget ran?
2) Wie komme ich an das myline im mywidget ran?
Lösung:
1) Mache das mywidget-Objekt, welches du in jener Funktion erstellst, zu einem Member von mainwindow. Hast du mehrere mywidgets, dann speicher in mainwindow eine QListy<mywidget*>, und leg die erstellten Objekte da rein. So hast du jederzeit das Objekt zur Verfügung. Alternativ gibt es in QObject auch noch die "findChild"-Methode.
2) Das wäre die simplere Frage: Einfach eine Funktion in mywidget anbieten, die die Funktion zurückgibt.