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();
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;
...
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....
}
...
...
Code: Alles auswählen
...
private:
Ui::MainWindow *ui;
Config *cfg;
Network *net;
...
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();
}
Irgendwie wäre so was in der Network-Klasse toll:
Code: Alles auswählen
parentWindow->signalConnect()
parentWindow->signalDisconnect()
parentWindow->signalError()
parentWindow->signalNewDate(QString socketdaten)
...
Gruß
Thorsten