wangzhonghao22 2022-04-12 10:59
浏览 184
已结题

使用QDataStream总是会报错而且还是in >>报错

想要根据枚举类的不同读出结构体的内容,但总是报错

错误: D:\QT\5.15.2\study\AServer\aserver.cpp:111: error: invalid operands to binary expression ('QDataStream' and 'char')

怀疑过时版本问题,因为在同事电脑上能完美运行,调了一下版本还是不行。
结构体
#ifndef FRAMEDEFINITION_H
#define FRAMEDEFINITION_H
#include <QString>

struct FrameHead            //帧头
{
    char a = 0XEB;
    char b = 0X90;
};

struct FrameEnd             //帧尾
{
    char a = 0X0D;
    char b = 0X0A;
};

struct frameDate            //数据帧
{
    FrameHead framehead;
    char framtype = '0';
    char datetype = '0';
    short datelenth;
    QString data;
    FrameEnd frameend;
};

struct frameControl         //控制帧
{
    FrameHead framehead;
    char frametype ='0';
    char controltype = '0';
    FrameEnd frameend;
};

struct frameState           //状态帧
{
    FrameHead framehead;
    char frametype ='0';
    char controltype ='0';
    FrameEnd frameend;
};
#endif // FRAMEDEFINITION_H


aserver.h
#ifndef ASERVER_H
#define ASERVER_H

#include "FrameDefinition.h"

#include <QWidget>
#include <QDomDocument>
#include <QDomElement>
#include<QDomProcessingInstruction>
#include <QMessageBox>
#include <QTcpSocket>
#include <QTcpServer>
#include <QUdpSocket>
#include <QHostAddress>
#include <QHostInfo>
#include <QTextStream>
#include <QIODevice>
#include <QDir>
#include <QFile>


QT_BEGIN_NAMESPACE
namespace Ui { class Aserver; }
QT_END_NAMESPACE

enum FreeType{Data,Control,State};

class QTcpServer;
class QTcpSocket;

class Aserver : public QWidget
{
    Q_OBJECT

public:
    Aserver(QWidget *parent = nullptr);
    ~Aserver();

protected:
    QString getMessage();
    QString ascllTohex(QByteArray array);
    void showSource(QString sourceMessage);
    void sendMessage(FreeType type);

    bool createXML();
    bool openXML();
    bool writeXML(const QString &fileName);
    bool readXML(const QString &fileName);
    bool saveXML(const QString &fileName,QDomDocument &doc);
    void listDom(QDomElement &docElem);

private:
    Ui::Aserver *ui;

    frameDate dataframe;
    frameControl controlframe;
    frameState stateframe;

    QTcpServer *tcpserver;
    QTcpSocket *tcpsocket;
    QString IP;
    QString TIP;
    QUdpSocket *udp;
    QUdpSocket *udpMulticast;

    QByteArray tGetArray;
    QByteArray tSetArray;

    qint16 port;
    qint16 tport;

    bool ynSource = true;
    QString time;
    QString showMessage;

private slots:
    void processPendingDatagrams();
    void on_sourceBtn_clicked();

    void on_sendBtn_clicked();

    void on_checkBox_stateChanged(int arg1);

    void on_comboBox_currentIndexChanged(int index);


};
#endif // ASERVER_H



aserver.cpp
void Aserver::processPendingDatagrams()
{
    qDebug() << "tcpsocket进入了";
    while (udp->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udp->pendingDatagramSize());
        udp->readDatagram(datagram.data(),datagram.size());
        QDataStream in(&datagram,QIODevice::ReadOnly);
        int type;
        in >> type;
        time = QDateTime::currentDateTime()
                .toString("yyyy-MM-dd hh:mm:ss");
        switch (type)
        {
        case Data:
        {

            in >> dataframe.framehead.a >> dataframe.framehead.b >> dataframe.framtype >> dataframe.datetype >> dataframe.data
                    >>dataframe.data >> dataframe.frameend.a >> dataframe.frameend.b;

            showMessage = dataframe.data;

            showSource(showMessage);
            break;
        }
        case Control:
        {
            break;
        }
        case State:
        {
            in >> stateframe.framehead.a >> stateframe.framehead.b >> stateframe.frametype >> stateframe.controltype
                >>stateframe.frameend.a >> stateframe.frameend.b;
            if (stateframe.controltype == '0')
            {
                ui->checkBox->setCheckState(Qt::Checked);
            }
            else
            {
                ui->checkBox->setCheckState(Qt::Unchecked);
            }
            break;
        }
        }
    }
    while (tcpsocket->bytesAvailable() != 0)
    {
        qDebug() << "读取了";
        QDataStream in(tcpsocket);
        int type;
        in >> type;
        time = QDateTime::currentDateTime()
                .toString("yyyy-MM-dd hh:mm:ss");
        switch (type)
        {
        case Data:
        {
            in >> dataframe.framehead.a >> dataframe.framehead.b >> dataframe.framtype >> dataframe.datetype >> dataframe.data
                    >>dataframe.datelenth >> dataframe.frameend.a >> dataframe.frameend.b;
            showMessage = dataframe.data;
            showSource(showMessage);
            break;
        }
        case State:
        {
            in >> stateframe.framehead.a >> stateframe.framehead.b >> stateframe.frametype >> stateframe.controltype
                >>stateframe.frameend.a >> stateframe.frameend.b;
            if(stateframe.controltype == '0')
            {
                ui->checkBox->setCheckState(Qt::Checked);
            }
            else
            {
                ui->checkBox->setCheckState(Qt::Unchecked);
            }
            break;
        }
        }
    }
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月20日
    • 创建了问题 4月12日

    悬赏问题

    • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
    • ¥15 远程安装一下vasp
    • ¥15 自己做的代码上传图片时,报错
    • ¥15 Lingo线性规划模型怎么搭建
    • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
    • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
    • ¥50 comsol温度场仿真无法模拟微米级激光光斑
    • ¥15 上传图片时提交的存储类型
    • ¥15 VB.NET如何绘制倾斜的椭圆
    • ¥15 arbotix没有/cmd_vel话题