В Qt лямбда-выражение не может вызвать слот ([this] () изменяемый {QTimer :: SingleSlot (200, this, SLOT (DataReceived ()));} - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь захватить последовательные данные, используя QTimer :: SingleShot в лямбда-выражении. Когда & QSerialPort :: readyRead Получен сигнал, а затем в лямбда-выражении я указываю таймер одиночной съемки вызвать слот главного окна, но это не сработало.

Могу ли я использовать лямбду как это или нет?

connect (cHandler-> tSerial, & QSerialPort :: readyRead, this, [this] mutable {QTimer :: singleShot (200, this, SLOT (DataReceived ()));});

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include "comm.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
     comm *cHandler;
     MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
     uint8_t countReq;
     QTimer *rTime;
private:
     Ui::MainWindow *ui;
public slots:
   void QueryMethod(bool);
   void excRequest();
   void DataReceived();
   void ReceivedDataAndUpdateGUi(QByteArray);
   void SerialPortRadioCallBack (bool);
   void TcpIpRadioCallBack      (bool);
   void TcpIpClientRadioCallBack(bool);
   void TcpIpServerRadioCallBack(bool);
   void SwitchCommType();
   void TcpIpServerListenCallBack(bool);
   void TcpIpClientConnectCallBack(bool);
   void RefreshSerialPortCallBack(bool);
   void ConnectSerialPortCallBack(bool);
 };
 #endif // MAINWINDOW_H

MainWindow. cpp [некоторый код]

void MainWindow::ConnectSerialPortCallBack (bool)
{
   if( ui->ConnectSerialPortButton->text() == "Open")
   {
    try {
        QSerialSett SerialConfig = {
            ui->PortComboBox->currentText(),
            static_cast <QSerialPort::BaudRate>(ui->BaudComboBox->currentText().toUInt()),
            static_cast <QSerialPort::DataBits>(ui->DataBitsComboBox->currentIndex()+5),
            static_cast <QSerialPort::StopBits>(ui->StopBitsComboBox->currentIndex()),
            static_cast <QSerialPort::Parity>  (ui->ParityComboBox->currentIndex()),
            QSerialPort::NoFlowControl
        };
        cHandler->tSerial = new portComm(this,SerialConfig);
        connect(cHandler->tSerial,&QSerialPort::readyRead,this, [this]() mutable {QTimer::singleShot(200,this,SLOT(DataReceived()));  } ); //qDebug() <<cHandler->tSerial.readAll(); print correct data here
        cHandler->setLastSessionType(BS_SERIAL_TYPE);
        ui->ConnectSerialPortButton->setText("Connected");
        ui->ConnectSerialPortButton->setStyleSheet("background-color:green; color:white;");
    } catch (...) {
        qDebug() << "SERIAL PORT ERROR !";
    }
   }
 else
   {
    cHandler->tSerial-> close();
    delete  cHandler->tSerial;
    qDebug() << "SERIAL PORT CLOSED ::";
    cHandler->setLastSessionType(BS_NO_TYPE);
    ui->ConnectSerialPortButton->setText("Open");
    ui->ConnectSerialPortButton->setStyleSheet("background-color:red; color:white;");

   }
}

void MainWindow::DataReceived()
{
cHandler->tSerial->readAll();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...