Подключите сигнал суперкласса объекта - PullRequest
0 голосов
/ 28 февраля 2020

Я работаю с QProcess и подключил сигнал QProcess readyReadStandardOutput().

Этот процесс обычно регулярно выплевывает данные на консоль, но readyReadStandardOutput(), кажется, пакетные результаты и излучать только каждые полминуты или около того (со всеми накопленными данными).

Я хочу получить доступ к "прямой трансляции" QProcess, поэтому я подумал, что, возможно, QProcess ' s суперкласс QIODevice имеет некоторые другие сигналы.

Другие решения вместо использования байтов также приветствуются

Теперь я пытаюсь подключить 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;
}

1 Ответ

1 голос
/ 28 февраля 2020

Если вы хотите использовать старый устаревший способ подключения сигналов к слотам, вам также необходимо включить список параметров:

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

Или вы можете просто использовать современный способ Qt5 времени компиляции :

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

Также обратите внимание, что bytesWritten срабатывает при успешном выполнении команды write с ВАШЕГО конца. Похоже, вы не отправляете никаких входных данных, поэтому они никогда не сработают.

...