如何解决Qt串行端口错误“编译控制器PC时不是&qserialport的成员”?

我正在基于Qt 5.5.1(GCC 4.9.1 20140922(Red Hat 4.9.1-10),32位)的Qt Creator 3.5.1(开源)中使用。问题是在构建项目控制器PC时发生错误“不是'QSerialPort'connect(serial,&QSerialPort :: errorOccurred,this的成员。                                   ^ 在Serialconnector.cpp中。 请解决。

*Serialconnector.cpp .  

 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Institute nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 * THE SOFTWARE PROVIDER OR DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include "serialconnector.h"
#include "sdn-serial-send.h"
#include "sdn-reliability.h"

#include <QTcpSocket>
#include <QSerialPort>

#include <iostream>

SerialConnector::SerialConnector(QObject *parent) : QObject(parent) {

    connect(&serializer, &Serializer::new_packet_available, [this](QByteArray packet){
        if(packet.size() == sizeof(sdn_serial_packet_t)) {
            decodeSerialPacket(SerialConnector::castToPacketType(packet));
        }
    });
}

SerialConnector::SerialConnector(const QString& serial_port, QObject *parent) : SerialConnector(parent) {

    initConnection(serial_port);
}

SerialConnector::SerialConnector(const QString &ip, quint16 port, QObject *parent) : SerialConnector(parent) {

    initConnection(ip, port);
}

SerialConnector::~SerialConnector() {

    if(device) {
        delete device;
    }
}

bool SerialConnector::ready() {

    return isReady;
}

void SerialConnector::requestNodeId() {

    if(ready()) {
        sdn_serial_packet_t packet;
        memset(&packet, 0, sizeof(sdn_serial_packet_t));
        packet.header.msg_type = SDN_SERIAL_MSG_TYPE_ID_REQUEST;
        packet.header.payload_len = 0;
        QByteArray rawBytes = serializer.packetizer(&packet);
        device->write(rawBytes);
    }
}

void SerialConnector::sendGenericPacket(sdn_serial_packet_t *packet) {

    if(ready()) {
        QByteArray rawBytes = serializer.packetizer(packet);
        // unsigned int i;
        // for (i=0; i < rawBytes.length(); i++) {
        //     printf("%02X ",((unsigned char*)rawBytes.constData())[i]);
        // }
        // printf("\n");
        qint64 ret = device->write(rawBytes);
        if (ret == -1) {
            std::cout << "ERROR on device->write" << std::endl;
        //} else {
        //     std::cout << "device->write " << ret << " bytes" << std::endl;
        }
    }
}

void SerialConnector::initConnection(const QString& serial_port) {

    if(device) {
        device->close();
        delete device;
    }

    QSerialPort *serial = new QSerialPort(serial_port);
    serial->setBaudRate(QSerialPort::Baud115200);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);

    connect(serial, &QSerialPort::errorOccurred, [this]() {
        isReady = false;
        emit state_changed_stringfy("Serial error ocurred.");
    });

    isReady = serial->open(QIODevice::ReadWrite);
    device = serial;
    if (isReady) {
        emit state_changed_stringfy("Serial connected");
    }

    connect(device, &QIODevice::readyRead, this, [this]() {
        data_received();
    });
}

void SerialConnector::initConnection(const QString &ip, quint16 port) {

    if(device) {
        delete device;
    }

    QTcpSocket *socket = new QTcpSocket();

    connect(socket, &QTcpSocket::stateChanged, [this](QAbstractSocket::SocketState state) {
        QString stateString = QString(state == QAbstractSocket::UnconnectedState ? "UnconnectedState" :
                                 state == QAbstractSocket::HostLookupState ? "HostLookupState" :
                                 state == QAbstractSocket::ConnectingState ? "ConnectingState" :
                                 state == QAbstractSocket::ConnectedState ? "ConnectedState" :
                                 state == QAbstractSocket::BoundState ? "BoundState" :
                                 state == QAbstractSocket::ListeningState ? "ListeningState" :
                                 state == QAbstractSocket::ClosingState ? "ClosingState" : "");

        if(state == QAbstractSocket::ConnectedState) {
            isReady = true;
        }
        else {
            isReady = false;
        }

        emit state_changed_stringfy(stateString);
    });

    socket->connectToHost(ip, port);

    device = socket;

    connect(device, &QIODevice::readyRead, this, [this]() {
        data_received();
    });
}

void SerialConnector::data_received() {

    if(device) {
        while(device->bytesAvailable() > 0) {
            char max_data[512];
            int len = device->read(max_data, 512);
            serializer.processBytes(max_data, len);
        }
    }
}

void SerialConnector::decodeSerialPacket(sdn_serial_packet_t *packet) {

    //qDebug() << "[MainWindow::decodePacket] New Packet";
    if(packet->header.msg_type == SDN_SERIAL_MSG_TYPE_PRINT) {

        QByteArray string((char*)packet->payload, packet->header.payload_len);
//        QString text = QString("ID %1: %2").arg((int)packet->header.node_addr.u8[1]).arg(QString(string).remove("\n"));
        QString text = QString("%1").arg(QString(string));
        emit printfString(text);

    } else if(packet->header.msg_type == SDN_SERIAL_MSG_TYPE_ID_REQUEST){

         emit nodeIdReceived((sdnaddr_t *)packet->header.node_addr.u8);

    } else if(packet->header.msg_type == SDN_SERIAL_MSG_TYPE_RADIO){

        emit defaultPacket(QByteArray((char*)packet, sizeof(sdn_serial_packet_t)));

    } else if(packet->header.msg_type == SDN_SERIAL_MSG_TYPE_RADIO_ACK){

        emit ackReceived(SERIAL_TX_ACK);

    } else if(packet->header.msg_type == SDN_SERIAL_MSG_TYPE_RADIO_NACK){

        emit nackReceived(SERIAL_TX_NACK);

    } else if(packet->header.msg_type == SDN_SERIAL_MSG_TYPE_TIMER){

        sdn_reliability_timer_event();

    } else if(packet->header.msg_type != SDN_SERIAL_MSG_TYPE_EMPTY){

        emit customPacket(QByteArray((char*)packet, sizeof(sdn_serial_packet_t)));
    }
}

void SerialConnector::close() {

    device->close();
}
* serialconnector.h

/*
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Institute nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 * THE SOFTWARE PROVIDER OR DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef SERIALCONNECTOR_H
#define SERIALCONNECTOR_H

#include <QObject>
#include <QIODevice>

#include "serializer.h"

class SerialConnector : public QObject
{
    Q_OBJECT
public:
    explicit SerialConnector(QObject *parent = 0);
    SerialConnector(const QString& serial_port, QObject *parent = 0);
    SerialConnector(const QString& ip, quint16 port, QObject* parent = 0);
    ~SerialConnector();

    void initConnection(const QString &ip, quint16 port);
    void initConnection(const QString& serial_port);
    void close();
    bool ready();
    void requestNodeId();

    static sdn_serial_packet_t* castToPacketType(QByteArray &packet) {
        return (sdn_serial_packet_t*)packet.data();
    }

    void sendGenericPacket(sdn_serial_packet_t *packet);

signals:

    void state_changed_stringfy(QString state);
    void nodeIdReceived(sdnaddr_t *nodeId);
    void printfString(QString string);
    void defaultPacket(QByteArray packet);
    void customPacket(QByteArray packet);
    void ackReceived(int status);
    void nackReceived(int status);

protected:

    void decodeSerialPacket(sdn_serial_packet_t *packet);
    void data_received();
    void decodePacket(sdn_serial_packet_t *packet);

private:

    Serializer serializer;
    QIODevice *device = nullptr;
    bool isReady = false;

};

#endif // SERIALCONNECTOR_H
* controller-pc.pro

QT       += core gui network serialport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = "controller-pc"
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

DEFINES += SDN_CONTROLLER_PC

DEFINES += DEBUG_SDN

DEFINES += SDNADDR_SIZE=2
DEFINES += DIGRAPH_VERTICE_ID_SIZE=SDNADDR_SIZE

DEFINES += SDN_MAX_PACKET_SIZE=115

DEFINES += SDN_SEND_QUEUE_SIZE=100
DEFINES += SDN_RECV_QUEUE_SIZE=100

DEFINES += SDN_CONF_METRIC=dummy_metric
#dummy_metric | mamdani_fuzzy_model_metric

# Defines when changes from route weight can be used in flow setup.
DEFINES += SDN_ROUTE_SENSIBILITY=0.5

DEFINES += SDN_CONF_TX_RELIABILITY=1
DEFINES += SDN_NEIGHBORINFO_NEIGHBORS_TO_SRC
DEFINES += SDN_NEIGHBORINFO_SRC_TO_NEIGHBORS

DEFINES += SDN_SOURCE_ROUTED
#DEFINES += SDN_INFORM_NEW_EDGE_SERIAL

# routes sensibility related setings
DEFINES += WEIGHT_ETX=1.0
DEFINES += WEIGHT_ENERGY=0.0

#Management flag
#DEFINES += MANAGEMENT

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

#INCLUDEPATH+=../../

include(controller-pc.pro.contiki)

INCLUDEPATH+=$$CONTIKI/core/
INCLUDEPATH+=../../sdn-common/
INCLUDEPATH+=../
INCLUDEPATH+=../digraph/

SOURCES += main.cpp\
        mainwindow.cpp \
    serializer.cpp \
    serialconnector.cpp \
    ../../sdn-common/control-flow-table.c \
    ../../sdn-common/data-flow-table.c \
    ../../sdn-common/sdn-addr.c \
    ../../sdn-common/sdn-debug.c \
    ../../sdn-common/sdn-packetbuf.c \
    ../../sdn-common/sdn-queue.c \
    ../../sdn-common/sdn-send-packet.c \
    ../../sdn-common/sdn-process-packets.c \
    ../../sdn-common/sdn-unknown-route.c \
    $$CONTIKI/core/lib/list.c \
    ../digraph/digraph.c \
    ../digraph/dummy-metric.c \
    ../digraph/mamdani-fuzzy-model-metric.c \
    ../digraph/dijkstra.c \
    ../controller-core.c \
    ../sdn-flow-table-cache.c \
    ../sdn-serial-send.c \
    ../sdn-process-packets-controller.c \
    ../sdn-reliability.c \
    mainwindow_wrapper.cpp

HEADERS  += mainwindow.h \
    serializer.h \
    serialconnector.h \
    ../../sdn-common/control-flow-table.h \
    ../../sdn-common/data-flow-table.h \
    ../../sdn-common/sdn-addr.h \
    ../../sdn-common/sdn-constants.h \
    ../../sdn-common/sdn-debug.h \
    ../../sdn-common/sdn-packetbuf.h \
    ../../sdn-common/sdn-protocol.h \
    ../../sdn-common/sdn-queue.h \
    ../../sdn-common/sdn-send-packet.h \
    ../../sdn-common/sdn-process-packets.h \
    ../../sdn-common/sdn-unknown-route.h \
    ../../sdn-common/sdn-serial-packet.h \
    $$CONTIKI/core/lib/list.h \
    ../digraph/digraph.h \
    ../digraph/dummy-metric.h \
    ../digraph/mamdani-fuzzy-model-metric.h \
    ../digraph/dijkstra.h \
    ../digraph/sdn-metric.h \
    ../controller-core.h \
    ../sdn-flow-table-cache.h \
    ../sdn-serial-send.h \
    ../sdn-process-packets-controller.h \
    ../sdn-reliability.h \
    mainwindow_wrapper.h

QMAKE_CXXFLAGS += -std=c++0x

FORMS    += mainwindow.ui

DISTFILES += \
    controller-pc.pro.contiki
general message:
Could not find qmake configuration file default.
Error while parsing file /home/user/contiki/it-sdn/controller-server/controller-pc/controller-pc.pro. Giving up.
Warnings while parsing QML type information of /home/user/Qt/5.5/gcc/qml:
<dump of /home/user/Qt/5.5/gcc/qml>:1:24: Reading only version 1.1 parts.
<dump of /home/user/Qt/5.5/gcc/qml>:10:5: Expected only Component and ModuleApi object definitions.


**Error**
 error: 'errorOccurred' is not a member of 'QSerialPort'connect(serial, &QSerialPort::errorOccurred, [this]() {                                                              ^
home/user/contiki/it-sdn/controller-server/controller-pc/