我要做的是使用QProcess
在另一个程序中启动程序,然后将启动程序的输出保存到启动程序的QTextEdit
中。每次启动此程序时,我都希望它向QTextEdit
添加更多文本。现在我让程序启动但是在文本应该被写入后它崩溃了。这是代码:
#include <QWidget>
#include <QPushButton>
#include <QTextEdit>
#include <QProcess>
#include <QVBoxLayout>
#include <QApplication>
class Widget : public QWidget
{
Q_OBJECT
QTextEdit* text;
public:
Widget() : text(new QTextEdit) {
QPushButton* addBtn = new QPushButton("Add Module");
text->setReadOnly(true);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(addBtn,0);
layout->addWidget(text);
connect(addBtn,SIGNAL(clicked()),SLOT(launchModule()));
}
Q_SLOT void launchModule() {
QString program = "C:/A2Q2-build-desktop/debug/A2Q1.exe";
QProcess *myProcess = new QProcess(this);
connect(myProcess, SIGNAL(finished(int)), SLOT(finished()));
connect(myProcess, SIGNAL(error(QProcess::ProcessError)), SLOT(finished()));
myProcess->start(program);
}
Q_SLOT void finished() {
QProcess *process = qobject_cast<QProcess*>(sender());
QString out = process->readAllStandardOutput(); // will be empty if the process failed to start
text->append(out);
delete process;
}
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Widget w;
w.show();
app.exec();
}
#include "main.moc"
答案 0 :(得分:3)
它崩溃了,因为您在插槽内删除了发件人对象。而不是delete process
,你应该
process->deleteLater();
出于记录目的,您应该使用QPlainTextEdit
而不是QTextEdit
。前者更快。你使用后者过早地悲观了。唉,如果你发送大约100行/秒(至少在Qt 4.8上),即使QPlainTextEdit
也会变得极其缓慢。如果你想要一个非常快速的日志视图,你需要use QListWidget
, with a caveat,或者自己动手。
我有一个完整的示例,说明如何在another answer中发送和接收流程。
答案 1 :(得分:1)
该进程正在崩溃,因为您正在完成的插槽中删除父级。
此外,做这样的事情可能更容易:
QObject::connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(getOutput()));
而不是使用finished()
广告位。但这比任何事情都更具个人偏好。