从函数发出信号时出现QT错误

  • 本文关键字:QT 错误 信号 函数 qt
  • 更新时间 :
  • 英文 :


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

代码是:

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

Q_OBJECT宏缺少

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

最新更新