#include "widgetclient.h"
#include "ui_widgetclient.h"
#include <QGridLayout>
#include <QTimer>
#include <QDateTime>
WidgetClient::WidgetClient(QWidget *parent) :
QWidget(parent),
ui(new Ui::WidgetClient)
{
ui->setupUi(this);
//此处的bind是个重载函数,连接本机的port端口,采用ShareAddress模式(即允许其它的服务连接到相同的地址和端口,特别是
//用在多客户端监听同一个服务器端口等时特别有效),和ReuseAddressHint模式(重新连接服务器)
mUdpSocket.bind(5824, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
//readyRead()信号是每当有新的数据来临时就被触发
connect(&mUdpSocket,SIGNAL(readyRead()),SLOT(onProcessPendingDatagrams()));
mDataLabel = new QLabel(tr("Data:"));
mTimeLabel = new QLabel(tr("Time:"));
mTemperatureLabel = new QLabel(tr("Temperature:"));
mhumidtyLabel = new QLabel(tr("Hunidity:"));
mAltitudeLabel = new QLabel(tr("Altitude:"));
mDateLineEdit = new QLineEdit;
mTimeLineEdit = new QLineEdit;
mTemperatureLineEdit = new QLineEdit;
mHunidityLineEdit = new QLineEdit;
mAltitudeLineEdit = new QLineEdit;
mDateLineEdit->setReadOnly(true);
mTimeLineEdit->setReadOnly(true);
mTemperatureLineEdit->setReadOnly(true);
mHunidityLineEdit->setReadOnly(true);
mAltitudeLineEdit->setReadOnly(true);
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(mDataLabel,0,0);
mainLayout->addWidget(mDateLineEdit,0,1);
mainLayout->addWidget(mTimeLabel,1,0);
mainLayout->addWidget(mTimeLineEdit,1,1);
mainLayout->addWidget(mTemperatureLabel,2,0);
mainLayout->addWidget(mTemperatureLineEdit,2,1);
mainLayout->addWidget(mhumidtyLabel,3,0);
mainLayout->addWidget(mHunidityLineEdit,3,1);
mainLayout->addWidget(mAltitudeLabel,4,0);
mainLayout->addWidget(mAltitudeLineEdit,4,1);
setLayout(mainLayout);
setWindowTitle(tr("Weather Station"));
}
WidgetClient::~WidgetClient()
{
delete ui;
}
void WidgetClient::onProcessPendingDatagrams()
{
QByteArray datagram;
while(mUdpSocket.hasPendingDatagrams()) //是否有数据包等待读取
{
//pendingDatagramSize为返回第一个在等待读取报文的size,resize函数是把datagram的size归一化到参数size的大小一样
datagram.resize(mUdpSocket.pendingDatagramSize()); //
//将读取到的不大于datagram.size()大小数据输入到datagram.data()中,datagram.data()返回的是一个字节数组中存储
//数据位置的指针
mUdpSocket.readDatagram(datagram.data(), datagram.size());
}
QDateTime dateTime;
double temperature;
double humidity;
double altitude;
QDataStream in(&datagram,QIODevice::ReadOnly); //从datagram中读取数据
in.setVersion(QDataStream::Qt_5_6);
//因为其属性为只读,所以是输入,值得注意的接收顺序与发送一致
in>>dateTime >> temperature >>humidity >>altitude;
mDateLineEdit->setText(dateTime.date().toString());
mTimeLineEdit->setText(dateTime.time().toString());
mTemperatureLineEdit->setText(tr("%1 C").arg(temperature));
mHunidityLineEdit->setText(tr("%1%").arg(humidity));
mAltitudeLineEdit->setText(tr("%1 m").arg(altitude));
}