0

我正在尝试做的是在另一个程序中使用启动程序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"
4

2 回答 2

3

它崩溃了,因为您在插槽内删除了发送者对象。而不是delete process,你应该

process->deleteLater();

出于记录目的,您应该使用QPlainTextEdit而不是QTextEdit. 前者更快。通过使用后者,你过早地悲观了。唉,QPlainTextEdit如果您发送大约 100 行/秒(至少在 Qt 4.8 上),甚至会变得非常缓慢。如果您想要一个非常快速的日志视图,您需要使用QListWidget, 有一个警告,或者自己动手。

我有一个完整的示例,说明如何在另一个答案中向进程发送和接收。

于 2013-09-09T19:54:18.590 回答
1

该过程正在崩溃,因为您要从已完成的插槽中删除父级。

此外,做这样的事情可能更容易:

QObject::connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(getOutput()));

而不是使用finished()插槽。但这比任何事情都更符合个人喜好。

于 2013-09-09T19:58:51.377 回答