#include "dialog.h"
#include "ui_dialog.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QtWidgets>
#include <QString>
#include <string>
#include <QObject>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//ui->degree_lcdNumber->display("---");
// ui->distance_lcdNumber->display("---");
arduino_is_available = false;
port_name = "";
arduino =new QSerialPort;
serialBuffer = "";
foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
if(serialPortInfo.hasVendorIdentifier() &&serialPortInfo.hasProductIdentifier()){
if(serialPortInfo.vendorIdentifier() == arduino_uno_vendorid){
if(serialPortInfo.productIdentifier()== arduino_uno_productid){
port_name = serialPortInfo.portName();
arduino_is_available = true;
}
}
}
}
if(arduino_is_available){
//open and configure the port
arduino->setPortName(port_name);
arduino->open(QSerialPort::ReadOnly);
arduino->setBaudRate(QSerialPort::Baud9600);
arduino->setDataBits(QSerialPort::Data8);
arduino->setParity(QSerialPort::NoParity);
arduino->setStopBits(QSerialPort::OneStop);
arduino->setFlowControl(QSerialPort::NoFlowControl);
QObject::connect(arduino,SIGNAL(readyRead()),this,SLOT(&serialReceived()));
}else{
//give error message
QMessageBox::warning(this,"Port Error","Couldn't find the Arduino!");
}
}
Dialog::~Dialog()
{
if(arduino->isOpen()){
arduino->close();
}
delete ui;
}
void Dialog::serialReceived(){
qDebug()<<"works" ;
QStringList bufferSplit = serialBuffer.split(".");
serialData = arduino->readAll();
serialBuffer += QString::fromStdString(serialData.toStdString());
serialBuffer = ",";
qDebug()<<bufferSplit;
}
void Dialog::updateLCD(const QString sensor_reading){
// ui->degree_lcdNumber->display(sensor_reading);
}
(H)
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QSerialPort>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
QSerialPort *arduino;
static const quint16 arduino_uno_vendorid =9025;
static const quint16 arduino_uno_productid =67;
void updateLCD(const QString);
void serialReceived();
QString port_name;
//void readSerial();
QByteArray serialData;
QString serialBuffer;
bool arduino_is_available;
};
#endif // DIALOG_H
我刚开始使用Qt。我想连接Qt和arduino。我正在读数据,但我无法连接arduino插槽。 我在编译后收到一条消息。消息是QObject :: connect:.. \ serial_sensor \ dialog.cpp中没有这样的插槽Dialog ::&amp; serialReceived():45 QObject :: connect :(接收者名称:'Dialog')。
我能知道为什么吗?
答案 0 :(得分:0)
根据Qt Signals and Slot documentation,Qt信号和插槽必须分别在signals:
和public slots:
下声明。
为什么我们这样做?
由于插槽是普通的成员函数,因此它们在直接调用时遵循正常的C ++规则。但是,作为插槽,它们可以通过信号插槽连接由任何组件调用,而不管其访问级别如何。这意味着从任意类的实例发出的信号可以导致在不相关的类的实例中调用私有槽。(根据Qt文档)
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
public slots :
void serialReceived();
signals :
// Declare Signals here.
private:
// other private declarations.
};
答案 1 :(得分:0)
您的连接失败的原因是您的连接语法错误。要么你混合了Qt的仿函数和基于字符串的连接,要么意外添加&amp;在serialReceived面前。您可以在下面找到两种连接方式。第一个是首选。您可以从here了解更多信息。因为Dialog是基于QObject的类,所以你可以调用connect。
基于Functor的连接:
connect(arduino, &QSerialPort::readyRead, this, &Dialog::serialReceived);
基于字符串的连接:
connect(arduino, SIGNAL(readyRead()), this, SLOT(serialReceived()));
如果您使用的是Qt4,则必须在声明中使用slots
。在Qt5中,连接并不严格要求slots
,但仍应使用它。如果你不使用它,你就不能使用内省。你不能,例如致电QMetaObject::invokeMethod
。因此,简而言之,就像其他人已经建议的那样在头文件中添加插槽。
public slots:
void serialReceived();