[gelöst] Eigene TCP-Klasse verwenden. Wie geht das?

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
shinji
Beiträge: 23
Registriert: 28. Juli 2010 19:01

[gelöst] Eigene TCP-Klasse verwenden. Wie geht das?

Beitrag von shinji »

Hallo!

Ich bastel gerade an einem kleinen Projekt rum, in dem ich auch Daten bei TCP senden und empfangen muss. Daher habe ich mir für die Geschichte mit dem TCPSocket eine eigene Klasse geschrieben, die ich in meiner mainwindow.cpp instanziiere und in der er momentan folgende Methoden gibt:

Code: Alles auswählen

public:
    void setDestinationIp(QString);
    void setDestinationPort(int);
    void setConnectTimeout(int);
    void connectHost();
    void disconnectHost();
    void send(QString data);

public slots:
    void onHostFound();
    void onConnect();
    void onDisconnect();
    void onError();
    void readFromSocket();
Funktioniert prinzipiell super. Allerdings brauche ich die Ergebnisse der Slots in meiner mainwindow.cpp bzw. möchte aus der Network-Klasse auch auf Widgets des Programmfensters zugreifen können. Also bei einem onConnect() z.B. ein Icon/text ändern lassen usw.

Jetzt stelle ich mich gerade, was die Vererbung, die Slots, Signale usw. bei Qt4 angeht wohl mega blöde an... aber wie realisiert man so was in meinem Fall richtig?

Bisher sieht es so aus:

network.h

Code: Alles auswählen

class Network : public QMainWindow
{
    Q_OBJECT
public:
    explicit Network(QWidget *parent = 0);
...
private:
    QTcpSocket *tcpSocket;
...
network.cpp

Code: Alles auswählen

Network::Network(QWidget *parent) :
    QMainWindow(parent)
{
    tcpSocket = new QTcpSocket(this);
}
...
...
void Network::connectHost()
{
    if (connected == true)
    {
        tcpSocket->disconnectFromHost();
        tcpSocket->abort();
    }
    else
    {
        connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onError()));
        connect(tcpSocket, SIGNAL(connected()), this, SLOT(onConnect()));
        connect(tcpSocket, SIGNAL(hostFound()), this, SLOT(onHostFound()));
        connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(onDisconnect()));
        connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readFromSocket()));

        tcpSocket->abort();
        tcpSocket->connectToHost(dstIp, dstPort);
    }
}
...
...
void Network::onConnect()
{
    qWarning("Verbindung wurde hergestellt!");
    connected = true;
    send("HALLO");

    // Benachrichtige MainWindow....ändere QLabel.... 
}
...
...

mainwindow.h

Code: Alles auswählen

...
private:
    Ui::MainWindow *ui;
    Config *cfg;
    Network *net;
...
mainwindow.cpp

Code: Alles auswählen

...
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    cfg = new Config;
    net = new Network();

    fillConfigValues();
    currentTab = 0;
}
...
...
void MainWindow::on_pb_connect_released()
{
    net->setDestinationIp(cfg->getIp());
    net->setDestinationPort(cfg->getPort());
    net->connectHost();
}
Also alles noch sehr rudimentär :D

Irgendwie wäre so was in der Network-Klasse toll:

Code: Alles auswählen

parentWindow->signalConnect()
parentWindow->signalDisconnect()
parentWindow->signalError()
parentWindow->signalNewDate(QString socketdaten)
...
Also das ich Signale einfach an die aufrufende Klasse weiter leite usw.

Gruß
Thorsten
Zuletzt geändert von shinji am 11. September 2011 20:26, insgesamt 1-mal geändert.
Urki
Beiträge: 10
Registriert: 25. Januar 2009 02:42

Re: Eigene TCP-Klasse verwenden. Wie geht das?

Beitrag von Urki »

Nunja, dazu kannst du ja auch Singal/Slot benutzen. Du machst dir ein eigenes Signal in der Network Klasse und verbindest das im MainWindow mit einem Slot.

Code: Alles auswählen

connect(net, SIGNAL(ichBinVerbunden()), this, SLOT(aendereLabel()));
In der Network klasse dann einfach das Signal auslösen. Dazu gibt es aber genügend Beispiele bei Qt. http://doc.qt.nokia.com/stable/signalsandslots.html

Zudem macht es nicht viel Sinn, wenn du deine Network Klasse von QMainWindow ableitest. Theoretisch kannst du auch einen Zeiger auf das MainWindow übergeben. Den Parameter hast du eh schon im Konstruktor. Wenn du den noch speicherst, kannst du auch über dieses Objekt auf alle Public Methoden und Variablen zugreifen.
shinji
Beiträge: 23
Registriert: 28. Juli 2010 19:01

Re: Eigene TCP-Klasse verwenden. Wie geht das?

Beitrag von shinji »

Ah.... stimmt... es es gibt ja emit(). Habe ich garnicht mehr dran gedacht. O.O

Ich probier das mal aus- Vielen Dank für den Hinweis!
Antworten