首页 > 解决方案 > 从函数发出信号时出现 QT 错误

问题描述

我有一个与串口通信的程序。当字节来自串行时,我不想使用readyRead我想发出的信号,这个信号连接到一个插槽来解析数据包,但是当我从读取线程时我有一个错误dataReceived signalemitSignal

代码是:

commSer.h:

     #ifndef COMMSERIAL_H
#define COMMSERIAL_H
#include<QtSerialPort>
#include"fileaccess.h"
#include <QtCore/qglobal.h>
#include<QThread>
class CommSerial:public QThread
{

private:
    QSerialPort *skt;
    QString portName;
    bool serialPortIsOepn;
    FileAccess *file;
    void initSkt();
    void openPort();

 signals:
    void dataReceived(QByteArray);

public slots:
    void writeToFile(QString);
    void sendTo(QString);
    void recievePacket(QByteArray);
public:
    CommSerial();
    ~CommSerial();
    bool stopReading;
    void run(void);
    QSerialPort* getPort(void);
};

#endif // COMMSERIAL_H

comSer.cpp

#include "commserial.h"
void CommSerial::initSkt()
{
    skt=new QSerialPort();
    portName="com3";
    skt->setPortName(portName);
    skt->setBaudRate(QSerialPort::Baud9600);
    skt->setDataBits(QSerialPort::Data8);
    skt->setParity(QSerialPort::NoParity);
    skt->setStopBits(QSerialPort::OneStop);
    skt->setFlowControl(QSerialPort::NoFlowControl);

    connect(this,SIGNAL(dataReceived),this,SLOT(recievePacket()));
}
#include<QDebug>
void CommSerial::openPort()
{
    if(skt->isOpen())
    {
       skt->close();
    }
    try {
        skt->open(QIODevice::ReadWrite);
        serialPortIsOepn=true;
    } catch (const std::exception& ex) {
       qDebug()<<"Erorr in :"<<ex.what();
       serialPortIsOepn=false;
    }

}

void CommSerial::writeToFile(QString str)
{
if(file->isOpen)
{
    //QByteArray ba=QByteArray::fromStdString( str.toStdString());
    //file->writeToFile(ba);
file->writeToFile(str);

}else {
qDebug()<<"serial port is not open";
}
}

void CommSerial::sendTo(QString str)
{
 if(serialPortIsOepn)
 {
     QByteArray ba=QByteArray::fromStdString(str.toStdString());
     skt->write(ba);
 }else {
qDebug()<<"serial port is not open now";
 }
}

void CommSerial::recievePacket(QByteArray ba)
{
    QByteArray recBa=ba;

}

CommSerial::CommSerial()

{
    stopReading=false;
    serialPortIsOepn=false;
    file=new FileAccess("d:/logSerial.txt");
    file->openFile();

    initSkt();
    openPort();
}

CommSerial::~CommSerial()
{
    skt->close();
    file->~FileAccess();
}

void CommSerial::run()
{
  while(!stopReading)
  {
     if(!skt->waitForReadyRead())
     {
         qDebug()<<"Serial Port has been closed";
         stopReading=true;
         break;
     }
     if(skt->bytesAvailable()>0)
     {
         QByteArray recBa=skt->readAll();
         emit dataReceived(recBa); // this line has a error
     }

     msleep(100);
  }
}

QSerialPort* CommSerial::getPort()
{
    return skt;
}

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    skt=new CommSerial();
    connect(skt->getPort(),SIGNAL(dataReceived()),this,SLOT(showRecievdData()));


}

错误:

error: undefined reference to `CommSerial::dataReceived(QByteArray)'
collect2.exe:-1: error: error: ld returned 1 exit status

标签: qt

解决方案


Q_OBJECT不见了

请注意,对于任何实现信号、槽或属性的对象,Q_OBJECT 宏都是必需的。您还需要在源文件上运行 Meta Object Compiler。我们强烈建议在 QObject 的所有子类中使用此宏,无论它们是否实际使用信号、槽和属性,因为不这样做可能会导致某些函数表现出奇怪的行为。


推荐阅读