connect(&process, &QProcess::readyReadStandardOutput, &process, this { QByteArray output = process.readAllStandardOutput(); emit sig_runTimeStr(QString(output)); qDebug()<<output; })这段代码如何在槽函数引用外部变量
时间: 2024-03-29 08:36:03 浏览: 135
在这段代码中,槽函数是一个Lambda表达式,它可以引用外部变量。Lambda表达式的格式是[外部变量列表](参数列表) { 函数体 },其中外部变量列表用于声明Lambda表达式中使用的外部变量。在这个例子中,&process和this是外部变量列表。&process用于将QProcess对象传递给Lambda表达式,从而可以在Lambda表达式中访问QProcess对象的成员函数和成员变量。this用于访问当前类的成员函数和成员变量。在Lambda表达式中,可以使用外部变量的值,但是不能修改外部变量的值。
相关问题
connect(&process, &QProcess::readyReadStandardOutput, [&process, this]() { QByteArray output = process.readAllStandardOutput(); emit sig_runTimeStr(QString(output)); qDebug()<<output; })
这段代码是使用Qt框架中的QProcess类来启动一个外部进程,并且将进程的标准输出流转化为QString类型的信号发射出去。在readyReadStandardOutput信号触发时,读取进程的标准输出流并将其转化为QString类型,并通过sig_runTimeStr信号发射出去。同时,使用qDebug()输出读取的标准输出流。
QProcess/home/hbwork/Desktop/work/UsbExpansionHouse/Uart/serialthread.cpp:652: error: invalid use of non-static member function 'void QProcess::readyReadStandardOutput(QProcess::QPrivateSignal)' ../UsbExpansionHouse/Uart/serialthread.cpp: In member function 'int SerialThread::exeProcedure(const QString&, QString)': ../UsbExpansionHouse/Uart/serialthread.cpp:652:39: error: invalid use of non-static member function 'void QProcess::readyReadStandardOutput(QProcess::QPrivateSignal)' connect( m_process &QProcess::readyReadStandardOutput, [&]() { ^~~~~~~~~~~~~~~~~~~~~~~
### 关于 QProcess 中 `readyReadStandardOutput` 的非静态成员函数编译错误
在 Qt 编程中,当尝试连接信号到槽或者 Lambda 表达式时,如果遇到类似于“invalid use of non-static member function”的错误,通常是因为未正确绑定对象实例与该成员函数的关系。
对于 `QProcess::readyReadStandardOutput()` 信号,在使用 Lambda 表达式处理此信号时,需确保将当前对象上下文传递给 Lambda 函数。以下是具体实现方式:
#### 正确的连接方法
通过显式指定对象实例来调用其成员函数可以解决上述问题。例如,假设有一个名为 `process` 的 `QProcess` 对象,则可以通过以下方式进行信号与槽的连接[^1]:
```cpp
connect(process, &QProcess::readyReadStandardOutput, this, [&]() {
QString output = process->readAllStandardOutput();
qDebug() << "Received standard output:" << output;
});
```
在此代码片段中:
- 使用了 C++11 的 Lambda 表达式作为目标槽。
- 明确指定了 `this` 和 `process` 实例之间的关系,从而解决了 “non-static member function” 错误。
另外需要注意的是,自 Qt6.4 开始,某些字符串操作函数如 `count` 已被标记为废弃并建议改用 `size` 或者 `length` 来替代。虽然这不影响 `QProcess` 类的行为,但在编写新代码时应遵循最新 API 推荐以保持一致性。
#### 示例程序展示如何读取标准输出流数据
下面给出一个完整的例子演示如何设置以及响应来自子进程的标准输出事件:
```cpp
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QProcess process;
QObject::connect(&process, &QProcess::readyReadStandardOutput, [](){
auto bytesAvailable = static_cast<int>(process.bytesAvailable()); // Use size instead of count from Qt6.4 onwards.
QByteArray data = process.readAllStandardOutput();
if (!data.isEmpty()) {
qDebug().noquote() << "[STDOUT]" << QString::fromUtf8(data);
}
});
process.start("echo", {"Hello World!"});
return app.exec();
}
```
在这个示例里我们还注意到从 Qt6.4 起推荐替换掉已弃用的方法名以便更好地表达语义.
阅读全文
相关推荐
















