Kommunikation zweier Fenster

Alles rund um die Programmierung mit Qt
Antworten
tobbbbi
Beiträge: 7
Registriert: 7. Juni 2009 17:56

Kommunikation zweier Fenster

Beitrag von tobbbbi »

Hallo!

Ich bin Informatik Student und neu in diesem Forum.

Habe zur Zeit ein Projekt in dem ich, nach langem Probieren, stecken geblieben bin und euch nun um Rat frage.

Wie ist es möglich bei zwei QMainWindows (oder auch QWidgets - egal) , die sich gegenseitig aufrufen (ein Hauptmenü, von dem aus ein weiteres Fenster aufgerufen wird), aus dem einen Fenster auf Widgets des anderen zuzugreifen?
Beispiel: Fenster1 und Fenster2 sind die QMainWindows und haben jeweils einen QPushButton um sich gegenseitig aufzurufen. Das heißt, klicke ich in Fenster1 auf den Button, wird Fenster1 auf hidden gesetzt und Fenster2 auf visible und umgekehrt.
Nun würde ich gerne beim Klick auf den Button den Text des Buttons des anderen Fensters ändern - aber wie mache ich das?

Hier ist mein Code:

fenster.h

Code: Alles auswählen

#ifndef FENSTER_H
#define FENSTER_H

#include <QtGui/QMainWindow>
#include "ui_fenster.h"
#include "fenster2.h"

class Fenster : public QMainWindow
{

	Q_OBJECT

public:

	Fenster(QWidget *parent = 0, Qt::WFlags flags = 0);
	~Fenster();
	Fenster2 *fen;
	void changeText(QString str);


private:
	Ui::FensterClass ui;


public slots:
	void on_pushButton_clicked();

};
#endif // FENSTER_H


fenster.cpp

Code: Alles auswählen

#include "fenster.h"


Fenster::Fenster(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{

	ui.setupUi(this);

}

Fenster::~Fenster()
{

}

void Fenster::on_pushButton_clicked()
{
	fen = new Fenster2(this);
	fen->show();
	this->setHidden(true);
}

void Fenster::changeText(QString str)
{
	this->ui.pushButton->setText(str);
}

fenster2.h

Code: Alles auswählen

#ifndef FENSTER2_H
#define FENSTER2_H

#include <QtGui/QMainWindow>
#include "ui_fenster2.h"
#include "fenster.h"

class Fenster2 : public QMainWindow
{
	Q_OBJECT

public:
	Fenster2(QWidget *parent = 0, Qt::WFlags flags = 0);
	~Fenster2();

private:
	Ui::Form ui;


public slots:
	void on_pushButton_clicked();

};

#endif // FENSTER2_H

fenster2.cpp

Code: Alles auswählen

#include "fenster2.h"

QWidget *p;

Fenster2::Fenster2(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	
	p = parent;
	ui.setupUi(this);
}

Fenster2::~Fenster2()
{

}

void Fenster2::on_pushButton_clicked()
{
		
	// Expliziter Downcast
	//((Fenster)p).changeText("Hallo");
	
	p->setVisible(true);
	this->setHidden(true);


	
}

Ich arbeite für das Layout mit dem QDesigner und habe die .ui Dateien weggelassen, weil sie in diesem Fall ja keine Rolle spielen dürfte.


Außerdem noch eine Frage:
Warum motzt der Compiler bei dieser Deklaration in der fenster.h rum:

Code: Alles auswählen

   Fenster2 *fen; 

Das sollte doch gehen oder?

Bitte sagt mir auch bescheid, wenn irgendwas am Code falsch oder nicht so toll ist, damit ich das gleich richtig mache.

Danke! :-)
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag von Superheftig »

das ganze kann nicht gehen weil fenster.h und fenster2.h sich gegenseitig includen. Deshalb bekommst du auch den fehler bei Fenster2 *fen;

du musst in beiden header klassen einfach einne forword deklaration machen.

fenster.h

Code: Alles auswählen

class Fenster2;

class Fenster1 {
.....
}
fenster2.h

Code: Alles auswählen

class Fenster;

class Fenster2 {
.....
}
und dann die dateien erst gegenseitig in den cpp dateien includen. c++
tobbbbi
Beiträge: 7
Registriert: 7. Juni 2009 17:56

Beitrag von tobbbbi »

Super, danke! Das hat mir schonmal sehr geholfen, was das Problem mit der Deklaration betrifft.

Nun ist aber halt noch die Frage, wie kriege ich es hin, aus Fenster2 auf die Widgets von Fenster1 zuzugreifen. In meinem Beispielcode sieht man ja, dass ich mir eine öffentliche Funktion in der Fenster1-Klasse gebastelt habe, die den Text vom QPushButton ändern soll.
In Fenster2 habe ich dann die übergebene parent-referenz(Typ: QWidget) auf Fenster1 downgecasted um auf die entsprechende Funktion zugreifen zu können. Leider klappt das aber nicht: Der Text ändert sich nicht.

Woran liegt's?
Ich schätze ja mal, dass der downcast nicht in Ordnung ist - aber wie sonst bekomme ich den richtigen Typ(Fenster)?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Bei einem so simplen Problem sind Castings, zyklomatische Abhängigkeiten und public Variabeln ein no-go...

Das ist doch ganz einfach mittels SIGNALs/SLOTs zu lösen. Fenster 1 kann doch auf Klick einfach ein SIGNAL werfen, welches im SLOT von Fenster 2 den Text ändert. Der connect() zwischen beiden kann dann z.B. in main() erfolgen, welches ja beide kennt.
Antworten