对象超类的连接信号
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
命令成功时触发。你似乎没有发送任何输入,所以这永远不会触发。
【讨论】:
第二种方式确实可以编译,但出现了您预期的问题。然后这回答了我在标题中提出的问题。我将创建一个关于实时提要的新问题。以上是关于对象超类的连接信号的主要内容,如果未能解决你的问题,请参考以下文章