对象超类的连接信号

Posted

技术标签:

【中文标题】对象超类的连接信号【英文标题】:Connect signal of superclass of object 【发布时间】:2020-02-28 14:25:29 【问题描述】:

我正在使用QProcess 并已连接QProcess 的信号readyReadStandardOutput()

该进程通常会定期向控制台输出数据,但readyReadStandardOutput() 似乎是批处理结果,并且每半分钟左右才发出一次(包含所有累积的数据)。

我想访问QProcess 的“实时提要”,所以我想QProcess 的超类QIODevice 可能还有其他信号。

也欢迎使用其他解决方案而不是使用 bytesWritten

现在我正在尝试连接bytesWritten,但它不允许我。

代码:

void MainWindow::on_Program_clicked() 
 program= new QProcess(this);
 QString file = "../folder/program/program.exe";
 QString directory = "../folder/program/";
 //qint64 pid;
 program->setWorkingDirectory(directory);
 program->start(file, "");
 program->waitForStarted();
 connect(program, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));


 //ERROR: "QObject::connect: No such signal QProcess::bytesWritten() in ..\---\mainwindow.cpp:45
 connect(program, SIGNAL(bytesWritten()), this, SLOT(myBytesWritten()));



void MainWindow::myBytesWritten() 
 QProcess *program = dynamic_cast<QProcess *>(sender());
 QByteArray outData = program->readAll();
 qDebug() << "DEBUG: " + outData;


//Works, but only emits a signal every so often, and not every time a new line is written to the console as when I launch the exe normally
void MainWindow::readOutput()

 QProcess *program = dynamic_cast<QProcess *>(sender());
 QByteArray outData = program->readAll();
 qDebug() << "DEBUG: " + outData;

【问题讨论】:

你知道program.exe 是如何输出到标准输出的吗?它可以缓冲标准输出。如果您可以从子进程中刷新它,它可能有助于使其更具交互性。 @vahancho 我不知道它在内部是如何工作的,我也无权访问代码。当我通过双击exe启动它时,它会像每秒一样输出一条消息。但是,当我使用 QProcess 执行此操作时,它会输出一条消息,其中所有这些消息每秒都连接有“\r\n”。所以我得到必要的输出比它通常出现在控制台中要晚很多。 【参考方案1】:

如果您想使用旧的、已弃用的将信号连接到插槽的方式,您还需要包含参数列表:

connect(program, SIGNAL(bytesWritten(int)), this, SLOT(myBytesWritten()));

或者您也可以使用现代的编译时 Qt5 方式:

connect(program, &QProcess::bytesWritten, this, &MainWindow::myBytesWritten);

还要注意bytesWritten 会在您的write 命令成功时触发。你似乎没有发送任何输入,所以这永远不会触发。

【讨论】:

第二种方式确实可以编译,但出现了您预期的问题。然后这回答了我在标题中提出的问题。我将创建一个关于实时提要的新问题。

以上是关于对象超类的连接信号的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Qt 中 QThread 类的特定对象发出信号?

从继承超类时实现matlab.system进行故障排除

Qt信号和槽的问题

如何从 QML 连接 C++ 对象的破坏信号?

如何从 QML 连接 C++ 对象的破坏信号?

将插槽连接到来自类派生的所有对象的信号