无法为 QT 连接函数提供参数

Posted

技术标签:

【中文标题】无法为 QT 连接函数提供参数【英文标题】:Cannot Give a Parameter To QT connect Function 【发布时间】:2016-05-25 08:28:01 【问题描述】:

我在 Visual Studio 2013 的 Qt 项目 (5.5) 中的串行通信中实现了读取字节。 我的代码在这里:

main.cpp

int main(int argc, char *argv[])


    QApplication app(argc, argv);
    //QCoreApplication coreApplication(argc, argv);
    int argumentCount = QCoreApplication::arguments().size();
    QStringList argumentList = QCoreApplication::arguments();

    QTextStream standardOutput(stdout);

    if (argumentCount == 1) 
        standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl;
        return 1;
    

    QSerialPort serialPort;
    QString serialPortName = argumentList.at(1);
    serialPort.setPortName(serialPortName);

    int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600;
    serialPort.setBaudRate(serialPortBaudRate);

    if (!serialPort.open(QIODevice::ReadOnly)) 
        standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    

    Camera cam2;
    //cam2.showCamera();
    cam2.showCamera();
    cam2.showFullScreen();

    QByteArray abc;
    SerialPortReader serialPortReader(&serialPort,abc);

    //return coreApplication.exec();
    return app.exec();

; 

serialportreader.cpp

#include "serialportreader.h"

#include <QCoreApplication>

QT_USE_NAMESPACE

SerialPortReader::SerialPortReader(QSerialPort *serialPort, QByteArray abc, QObject *parent)
: QObject(parent)
, m_serialPort(serialPort)
, m_standardOutput(stdout)

    connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead);       


SerialPortReader::~SerialPortReader()




void SerialPortReader::handleReadyRead()

    m_readData.append(m_serialPort->readAll());
    if (!m_readData.isEmpty()) 
        m_standardOutput << m_readData << endl;
        m_readData.clear();
    


此代码成功运行。我想将 m_readData 数组的内容设置为 abc 数组,以便我可以在主范围内评估消息。为了实现这一点,我将 abc 数组作为参数提供给 handleReadyRead 函数。但是,它给出了一个错误。代码在这里:

SerialPortReader::SerialPortReader(QSerialPort *serialPort, QByteArray abc, QObject *parent)
: QObject(parent)
, m_serialPort(serialPort)
, m_standardOutput(stdout)

    connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead(abc));


SerialPortReader::~SerialPortReader()




void SerialPortReader::handleReadyRead(QByteArray abc)

    m_readData.append(m_serialPort->readAll());
    if (!m_readData.isEmpty()) 
        m_standardOutput << m_readData << endl;
        m_readData.clear();
    
  

错误:

serialportreader.cpp(45): error C2102: '&' requires l-value

第 45 行:

connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead(abc));

【问题讨论】:

【参考方案1】:

您不能以这种方式将局部变量传递给插槽,但您尝试做的甚至不需要它。您可以将abc 存储到构造函数中的成员变量中,然后在槽中使用它。但是:您必须将其更改为引用,否则对构造函数的调用会复制数组,因此 main 函数中的原始数组不受影响。

您也可以将此数组实现为您的SerialReader 的成员变量,并提供一个getter 函数,以便main 函数(或数据的消费者)可以从阅读器实例。

【讨论】:

我应用了您的第二个建议,它解决了我的问题。但是,我想在调用 serialportreader 之后等待 main 函数,直到在该通信中收到一些消息。因为,在这些操作之后我需要那个数组。因此,我现在遇到了同步问题。 当您使用 Qt 时,显而易见的方法是在阅读器中发出信号并在您进行处理时创建一个插槽

以上是关于无法为 QT 连接函数提供参数的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 使用 lambda 函数修改先前连接信号的插槽参数

如果参数不是从末尾开始,则说明您无法从 QT 信号槽连接中删除参数的文档在哪里?

Qt::浅谈信号槽连接,参数在多线程中的使用

解决Qt程序在Linux下无法输入中文的办法(与下文连接)

Qt Pushbutton无法连接插槽

QT connect的两种连接方式。