首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QProcess保存到QTextEdit

QProcess保存到QTextEdit
EN

Stack Overflow用户
提问于 2013-09-09 19:40:19
回答 2查看 712关注 0票数 0

我要做的是使用QProcess在另一个程序中启动一个程序,然后将已启动程序的输出保存到启动程序的QTextEdit中。每次我启动这个程序时,我都希望它能向QTextEdit添加更多的文本。现在我开始启动程序,但是在文本被写完之后,它就崩溃了。以下是代码:

代码语言:javascript
复制
#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"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-09 19:54:18

它崩溃了,因为在插槽中删除发件人对象。而不是delete process,您应该

代码语言:javascript
复制
process->deleteLater();

出于日志记录的目的,您应该使用QPlainTextEdit而不是QTextEdit。前者更快。你用后者过早地悲观了。唉,如果您发送大约100行/s(至少在QT4.8上),甚至QPlainTextEdit也会变得非常慢。如果您想要一个非常快速的日志视图,则需要使用, with a caveat或自己的日志视图。

我有一个关于如何在another answer中发送和接收进程的完整示例。

票数 3
EN

Stack Overflow用户

发布于 2013-09-09 19:58:51

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

而且,做这样的事情可能更容易:

代码语言:javascript
复制
QObject::connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(getOutput()));

而不是使用finished()插槽。但这更多的是个人偏好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18705699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档