QSerialPort::readyRead couldn't connect to my slot.
-
//mainwindow.cpp #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QMetaMethod> #include <QSerialPort> #include <QSerialPortInfo> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new QSerialPort(this); serialPort->setPortName("COM4"); serialPort->setBaudRate(QSerialPort::Baud9600); serialPort->setDataBits(QSerialPort::Data8); serialPort->setParity(QSerialPort::NoParity); serialPort->setStopBits(QSerialPort::OneStop); serialPort->setFlowControl(QSerialPort::NoFlowControl); serialPort->open(QIODevice::ReadWrite); if(serialPort->isOpen()) serialPort->write("*IDN?\n"); connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readData); if(isSignalConnected(QMetaMethod::fromSignal(&QSerialPort::readyRead))) qDebug() << "connected"; else qDebug() << "disconnected"; } MainWindow::~MainWindow() { delete ui; } void MainWindow::readData(){ static QByteArray ba; size_t current = 0; if(serialPort->waitForBytesWritten(1000)){ } if(serialPort->waitForReadyRead(1000)){ } if(serialPort->bytesAvailable()){ ba = serialPort->readAll(); } }
//mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class QSerialPort; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QSerialPort* serialPort; private slots: void readData(); }; #endif // MAINWINDOW_H
This is minimal example to reproduce the error.
QObject::connect returns false when i try to connect QSerialPort::readyRead to MainWindow::readData slot. A lambda instead of class member function also doesn't work.
How could I fix this? What I'm doing wrong? Please, help me to figure it out.
Extra question: How will this work for multiple theads?
EDIT:
Qt version is 6.6.1. Compiler is MinGW 64-bit. Project generate system is cmake -
//mainwindow.cpp #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QMetaMethod> #include <QSerialPort> #include <QSerialPortInfo> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new QSerialPort(this); serialPort->setPortName("COM4"); serialPort->setBaudRate(QSerialPort::Baud9600); serialPort->setDataBits(QSerialPort::Data8); serialPort->setParity(QSerialPort::NoParity); serialPort->setStopBits(QSerialPort::OneStop); serialPort->setFlowControl(QSerialPort::NoFlowControl); serialPort->open(QIODevice::ReadWrite); if(serialPort->isOpen()) serialPort->write("*IDN?\n"); connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readData); if(isSignalConnected(QMetaMethod::fromSignal(&QSerialPort::readyRead))) qDebug() << "connected"; else qDebug() << "disconnected"; } MainWindow::~MainWindow() { delete ui; } void MainWindow::readData(){ static QByteArray ba; size_t current = 0; if(serialPort->waitForBytesWritten(1000)){ } if(serialPort->waitForReadyRead(1000)){ } if(serialPort->bytesAvailable()){ ba = serialPort->readAll(); } }
//mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class QSerialPort; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QSerialPort* serialPort; private slots: void readData(); }; #endif // MAINWINDOW_H
This is minimal example to reproduce the error.
QObject::connect returns false when i try to connect QSerialPort::readyRead to MainWindow::readData slot. A lambda instead of class member function also doesn't work.
How could I fix this? What I'm doing wrong? Please, help me to figure it out.
Extra question: How will this work for multiple theads?
EDIT:
Qt version is 6.6.1. Compiler is MinGW 64-bit. Project generate system is cmake@Enem said in QSerialPort::readyRead couldn't connect to my slot.:
if(isSignalConnected(QMetaMethod::fromSignal(&QSerialPort::readyRead)))
qDebug() << "connected";
else
qDebug() << "disconnected";Why don't you simply check the return value of your connect(...) call?
Read https://doc.qt.io/qt-6/qobject.html#isSignalConnected
"signal must be a signal member of this object, otherwise the behaviour is undefined"
This is exactly what you're doing wrong. -
//mainwindow.cpp #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QMetaMethod> #include <QSerialPort> #include <QSerialPortInfo> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new QSerialPort(this); serialPort->setPortName("COM4"); serialPort->setBaudRate(QSerialPort::Baud9600); serialPort->setDataBits(QSerialPort::Data8); serialPort->setParity(QSerialPort::NoParity); serialPort->setStopBits(QSerialPort::OneStop); serialPort->setFlowControl(QSerialPort::NoFlowControl); serialPort->open(QIODevice::ReadWrite); if(serialPort->isOpen()) serialPort->write("*IDN?\n"); connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readData); if(isSignalConnected(QMetaMethod::fromSignal(&QSerialPort::readyRead))) qDebug() << "connected"; else qDebug() << "disconnected"; } MainWindow::~MainWindow() { delete ui; } void MainWindow::readData(){ static QByteArray ba; size_t current = 0; if(serialPort->waitForBytesWritten(1000)){ } if(serialPort->waitForReadyRead(1000)){ } if(serialPort->bytesAvailable()){ ba = serialPort->readAll(); } }
//mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class QSerialPort; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QSerialPort* serialPort; private slots: void readData(); }; #endif // MAINWINDOW_H
This is minimal example to reproduce the error.
QObject::connect returns false when i try to connect QSerialPort::readyRead to MainWindow::readData slot. A lambda instead of class member function also doesn't work.
How could I fix this? What I'm doing wrong? Please, help me to figure it out.
Extra question: How will this work for multiple theads?
EDIT:
Qt version is 6.6.1. Compiler is MinGW 64-bit. Project generate system is cmakeThis post is deleted! -
@Enem said in QSerialPort::readyRead couldn't connect to my slot.:
if(isSignalConnected(QMetaMethod::fromSignal(&QSerialPort::readyRead)))
qDebug() << "connected";
else
qDebug() << "disconnected";Why don't you simply check the return value of your connect(...) call?
Read https://doc.qt.io/qt-6/qobject.html#isSignalConnected
"signal must be a signal member of this object, otherwise the behaviour is undefined"
This is exactly what you're doing wrong. -