Klassenübergreifender Zugriff auf QTextEdit

Alles rund um die Programmierung mit Qt
Antworten
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Klassenübergreifender Zugriff auf QTextEdit

Beitrag von mephistho »

Hi,

ich steh mal wieder aufm Schlauch und komme nicht runter.

Ich hab drei Klassen: ioServerGUI, ioServer und ioServerThread. Namen sind Programm.

In meiner ioServerGUI erstelle ich mir ein readonly QTextEdit, in dem ich Statusmeldungen ausgeben lassen möchte.

Wie realisiere ich es bitte, aus den anderen beiden Klassen auf dieses QTextEdit zugreifen zu können. Das QTextEdit ist private, aber ich habe mir eine public Methode geschrieben, die dort eben Text ausgeben kann. Aus der ioServerGUI-Klasse heraus funktioniert das natürlich auch. Aus den anderen Klassen jedoch nicht.

Soweit ich weiß müsste ich mir in den anderen Klassen jeweils ebenfalls ein Objekt der ioServerGUI erstellen, richtig? Ich bekomms nicht hin. Vielleicht seh ich vor lauter Bäumen den Wald nicht mehr, aber ich hab schon alles mögliche ausprobiert.

Wär schön, wenn mir da jemand ein konkretes Beispiel geben könnte.

Dank und Gruß
meph
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

mach eine funktion in der du einen QString als paramerter hast und übergib einen Pointer zu ioServerGui und starte jedesmal wenn du eine Nachricht einblenden lassen möchtest die funktion über den Pointer.
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Hm,

hier mal mein Code

ioserver.h

Code: Alles auswählen


#ifndef __ioserver_h__
#define __ioserver_h__

#include <QTcpServer>

#include <stdio.h>
#include <stdlib.h>
#include <mxio.h>
#include <unistd.h>
#include <iostream>


class ioServerGUI;

class ioServer : public QTcpServer
{
	Q_OBJECT
	
public: 
	ioServer(QObject *parent = 0);
	
protected:
	void incomingConnection(int socketDescriptor);
	
private:
	
	QTcpSocket *switchSocket;

	void connectToIO(QString hostaddress, quint16 port);
	void getTcpMessage( BYTE data[], WORD wSize );
	
	ioServerGUI *ioservergui;

};

#endif

ioserver.cpp

Code: Alles auswählen


#include "ioserver.h"
#include "ioserverthread.h"

#include "QMessageBox"

#include <stdlib.h>

ioServer::ioServer(QObject *parent)	: QTcpServer(parent) 
{
	
	ioservergui->writeServerLog("ioServer erstellt!");
	
}

Compiler-Ausgabe:

ioserver.cpp: In constructor ‘ioServer::ioServer(QObject*)’:
ioserver.cpp:11: error: invalid use of undefined type ‘struct ioServerGUI’
ioserver.h:13: error: forward declaration of ‘struct ioServerGUI’
Ich seh den Fehler nicht :?

Danke schon mal!

meph
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

#include "ioservergui.h"
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Dann bekomm ich nen Speicherzugriffsfehler. Vermutlich weil in der ioserver.cpp ein "ioServer ioserver = new ioServer" fehlt.

Wenn ich das reinsetze kompiliert ers aber gar nicht mehr, bzw. sitz in ner Endlosschleife die immer sinngemäß auswirft "attempting to add QLayout to [...] wich already has an QLayout"
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Hi,

ich hab nen anderen Ansatz mit neuem Problem. Und zwar mal ganz was ausgefallenes, was hier bestimmt noch nie Thema war: Signals und Slots :shock:

Ich hab mir überlegt, das über eigene Signals und Slots zu lösen.

Ein Objekt der Klasse ioServer wird wie gehabt in ioServerGUI erstellt.

ioServer emitiert das Signal serverStatusChanged().

ioServerGUI hat einen Slot writeServerLog(), der mit eben diesem Signal serverStatusChanged() verbunden ist:

Code: Alles auswählen

ioserver = new ioServer(this);

connect(ioserver, SIGNAL(serverStatusChanged()), this, SLOT(writeServerLog()));
Q_OBJECT ist in allen Klassen drin. qmake wurde ebenfalls danach aufgerufen.
Der Slot ist deklariert und implementiert. Wenn ich ihn im Konstruktor von ioServerGUI direkt aufrufe "writeServerLog()", funktioniert es...

Aus ioServer heraus möchte ich halt immer, wenn sich der Server-Status ändert, dieses Signal schicken und das GUI somit dazu bringen, die jeweiligen Status auszugeben. Momentan steht "emit serverStatusChanged()" direkt im Konstruktor. Es kommt aber nicht über. Der Slot wird nicht ausgeführt.

Irgendwelche Ideen woran das liegen könnte?

edit: Debian Linux mit Qt 4.3 & qmake

Wie immer danke ich schon hier :-/

Grüße
meph
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du kannst doch erst nach dem Konstruktor-Aufruf connecten also, kannst im Konstruktor auch nicht 'emitten'
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Hm, das wusst ich nicht.

Ein Aufruf von setServerStatus(), welche eine Variable setzt und serverStatusChanged() emitiert, im Konstruktor kann also auch nicht klappen?! :?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nein, du kannst ja erst 'connecten' wenn der Konstruktor schon komplett ausgeführt wurde. Außer du machst die 'connects' im Konstruktor.
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Ja, das (?!) connect steht ja im Konstruktor

Code: Alles auswählen


ioServerGUI::ioServerGUI(QWidget *parent): QWidget(parent)
{

[...]	
	ioserver = new ioServer(this);
	
	connect(ioserver, SIGNAL(serverStatusChanged()), this, SLOT(writeServerLog()));

}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und wo ist das zugehörige 'emit'? Deinem Code nach nicht im selben Konstruktor.

Oder anders gesagt: Kannst du sicherstellen, daß erst der 'connect' und dann das 'emit' ausgeführt wird? (Notfalls Debugger?)
mephistho
Beiträge: 58
Registriert: 14. September 2006 17:47

Beitrag von mephistho »

Oh man, ich bin mal kurz ne halbe Stunde weg, meinen Kopf gegen die Wand schlagen.

Keine weiteren Kommentare.

Danke...
Antworten