Qt と C++ を使用して行うプロジェクトがあります。まず、サンプルのクライアント サーバー プログラムを作成する必要があります。Qt Creator を使用して、Ui を設計し、接続してメッセージを読み取るためのコードをいくつか書きました。
しかし、サーバー クラスからプログラムの UI を更新できません。
正しくするにはどうすればよいですか?
メインウィンドウ.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
#include "serverwin.h"
#include <QtNetwork>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void connectClicked();
void disconnectClicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
serverwin.h
#ifndef SERVERWIN_H
#define SERVERWIN_H
#include <mainwindow.h>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
namespace server{
class MainWindow;
}
class ServerWin : public QTcpServer
{
Q_OBJECT
public:
ServerWin(QObject* parent);
protected:
void incomingConnection(int socketfd);
private slots:
void readyRead();
void disconnected();
private:
QSet<QTcpSocket*> clients;
};
#endif // SERVERWIN_H
main.cpp
#include <QApplication>
#include "mainwindow.h"
#include "serverwin.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow *uiwindow = new MainWindow();
uiwindow->show();
return a.exec();
}
メインウィンドウ.cpp
#include "mainwindow.h"
#include "ui_server.h"
#include "serverwin.h"
#include "QtNetwork/QTcpSocket"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->disconnectButton->setEnabled(false);
}
void MainWindow::connectClicked()
{
ui->connectButton->setEnabled(false);
ui->disconnectButton->setEnabled(true);
bool success = serv->listen(QHostAddress::Any, 4200);
if(!success)
{
ui->plainTextEdit->appendPlainText("Could not connect to port 4200, check your firewall settings.");
}
else
{
ui->plainTextEdit->appendPlainText("Connected");
}
}
//close server request by user
void MainWindow::disconnectClicked()
{
ui->disconnectButton->setEnabled(false);
ui->connectButton->setEnabled(true);
ui->plainTextEdit->appendPlainText("doesn't work, code to be added");
//disconnect server
}
MainWindow::~MainWindow()
{
delete ui;
}
serverwin.cpp
#include "serverwin.h"
ServerWin::ServerWin(QObject *parent)
{
}
void ServerWin::incomingConnection(int socketfd)
{
QTcpSocket *client = new QTcpSocket(this);
client->setSocketDescriptor(socketfd);
clients.insert(client);
qDebug() << "Client " + client->peerAddress().toString() + " is connected.";
connect(client, SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(client, SIGNAL(disconnected()), this, SLOT(disconnected()));
}
void ServerWin::readyRead()
{
QTcpSocket *client = (QTcpSocket*)sender();
while (client->canReadLine())
{
QString msg = "Client " + client->peerAddress().toString() + " says: " + QString::fromUtf8(client->readLine()).trimmed();
foreach (QTcpSocket *otherClient, clients)
otherClient->write(QString(msg + "\n").toUtf8());
qDebug() << msg;
}
}
// when a client is disconnected
void ServerWin::disconnected()
{
QTcpSocket *client = (QTcpSocket*)sender();
clients.remove(client);
QString notification = "Client " + client->peerAddress().toString() + " has Left.";
foreach (QTcpSocket *otherClient, clients)
otherClient->write(QString(notification + "\n").toUtf8());
qDebug() << notification;
}
テキスト ボックス (plaintextedit) がある GUI でデバッグ行を更新する必要があります。