Russian Qt Forum
Сентябрь 30, 2024, 20:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как вывести структуру,полученной из QTcpSocket на форму  (Прочитано 1993 раз)
User162
Гость
« : Июнь 26, 2013, 08:57 »

Всем привет!
Есть сервер который получает данные, согласно структуре:
server.h
Код:
#ifndef SERVER_H
#define SERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>

class Server : public QObject
{
    Q_OBJECT
public:
    explicit Server(QObject *parent = 0);

    struct MeteoData
    {
        quint8  TypePack,
                DevNo,
                Year,
                Month,
                Day,
                Hour,
                Min,
                Sec;

        float   wind_speed,
                wind_direction,
                temperature,
                atmospheric_pressure,
                hummidity;
    }md;
   
signals:
   
public slots:
    virtual void slotNewConnection();
    void slotReadClient();

private:
    QTcpServer *tcp_server;
   
};

#endif // SERVER_H

server.cpp
Код:
#include "server.h"

Server::Server(QObject *parent) :
    QObject(parent)
{
    tcp_server = new QTcpServer(this);
    if (!tcp_server->listen(QHostAddress::Any,48000))
    {
        qDebug()<<"Unable to start the server: %1." << tcp_server->errorString();
        tcp_server->close();
        return;
    }
    connect(tcp_server, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
}

void Server::slotNewConnection()
{
    QTcpSocket* ClientSocket = tcp_server->nextPendingConnection();
    connect(ClientSocket, SIGNAL(disconnected()), ClientSocket, SLOT(deleteLater()));
    connect(ClientSocket, SIGNAL(readyRead()), this, SLOT(slotReadClient()));
}


void Server::slotReadClient()
{
    MeteoData md;
    QTcpSocket* ClientSocket = (QTcpSocket*)sender();
    quint32 data_size = 0;
    QDataStream in(ClientSocket);
    in.setVersion(QDataStream::Qt_4_0);
    in.setByteOrder(QDataStream::LittleEndian);

    if (ClientSocket->bytesAvailable() < (int)sizeof(quint32))
    {
        qDebug() << "ERROR: not enought header";
    }

    in >> data_size;

    if (ClientSocket->bytesAvailable() < data_size)
    {
        qDebug() << "ERROR: not enought data";
    }

    in >> md.TypePack >> md.DevNo >> md.Year >> md.Month >> md.Day >> md.Hour >> md.Min >> md.Sec >> md.wind_speed >> md.wind_direction >> md.temperature >> md.atmospheric_pressure >> md.hummidity;

    qDebug() << "TypePack"              << md.TypePack              << "\n"
             << "DevNo"                 << md.DevNo                 << "\n"
             << "Year"                  << md.Year                  << "\n"
             << "Month"                 << md.Month                 << "\n"
             << "Day"                   << md.Day                   << "\n"
             << "Hour"                  << md.Hour                  << "\n"
             << "Min"                   << md.Min                   << "\n"
             << "Sec"                   << md.Sec                   << "\n"
             << "wind_speed"            << md.wind_speed            << "\n"
             << "wind_direction"        << md.wind_direction        << "\n"
             << "temperature"           << md.temperature           << "\n"
             << "atmospheric_pressure"  << md.atmospheric_pressure  << "\n"
             << "hummidity"             << md.hummidity             << "\n";

}

Необходимо пробросить эту структуру в MainWindow, чтобы потом вывести значения в лэйблы. помогите реализовать. Знаю что можно создать пустую структуру и передать по коннекту. а проще можно?

Код:
#ifndef testmw
#define testmw

#include <QMainWindow>
#include "TCP_Server/server.h"

namespace Ui {
class testmw;
}

class testmw : public QMainWindow
{
    Q_OBJECT
   
public:
    explicit testmw(QWidget *parent = 0);
    ~testmw();



private:
    Ui::testmw *ui;
    Server *srv;
};

#endif // testmw


Код:
#include "ui_testmw.h"
#include <QtGui>

testmw::testmw(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::testmw)
{
    ui->setupUi(this);

    srv = new Server(this);
    ui->label->setText(QString::number(srv->md.Sec));//хотел так, но не вышло
}

testmw::~testmw()
{
    delete ui;
}

Былоб хорошо, если можно на примере показать)))
Записан
Bepec
Гость
« Ответ #1 : Июнь 26, 2013, 09:06 »

Код превращения в строку.
Код:
	
QString stringOut ;
QDebug debug( &stringOut);
int x = 5;
int y = 6;
debug << x << y;
emit info(stringOut);

Объявление сигнала в сервере.
Код:
signals:
    void info(QString);

Объявление слота в mainWindow
Код:
private slots:
    void inServerInfo(QString);

Тело слота
Код:
void mainWindow::inServerInfo(QString inInfo)
{
    ui.label->setText(inInfo);
}

А сконнектить как сигнал и слот ты знать должен падаван юный.
Записан
User162
Гость
« Ответ #2 : Июнь 26, 2013, 09:10 »

Сртёмно как то.... А если в классе Server передать?
Записан
Bepec
Гость
« Ответ #3 : Июнь 26, 2013, 09:15 »

Это вариант с сигналами.

А можно тупо сделать у сервера метод, возвращающий структуру. Аля

Код:
public:
    const MeteoData getMeteoData();

А в теле мы возвращаем переменную, в которую записали структуру.
Код:
 const MeteoData Server::getMeteoData()
{
    return meteoData_;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 20.