1

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 でデバッグ行を更新する必要があります。

4

1 に答える 1

3

テキストの出力を担当するウィンドウ クラスでメンバー関数を作成する必要があります。例えば、

class MainWindow : public QMainWindow
{
<...>
public slots:
    <...>
    void displayMessage( const QString & message );
}

これで、この関数で次のように UI にアクセスできます。

void MainWindow::displayMessage( const QString & message )
{
    ui->plainTextEdit->appendPlainText( message );
}

これで、サーバーから行う必要があるのは、この関数を呼び出してメッセージを渡すことだけです。関数はクラスに属しているためMainWindow、メッセージの表示に問題はありません。明示的に呼び出すか、シグナルを接続することができます。

于 2013-02-04T10:35:17.867 に答える