Klassenübergreifender Zugriff auf QTextEdit
Klassenübergreifender Zugriff auf QTextEdit
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
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:
Hm,
hier mal mein Code
ioserver.h
ioserver.cpp
Compiler-Ausgabe:
Danke schon mal!
meph
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
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!");
}
Ich seh den Fehler nicht
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’
Danke schon mal!
meph
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"
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"
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
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:
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
ich hab nen anderen Ansatz mit neuem Problem. Und zwar mal ganz was ausgefallenes, was hier bestimmt noch nie Thema war: Signals und Slots
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()));
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
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()));
}