【问题标题】:QIODevice::read (QProcess): device not openQIODevice::read (QProcess): 设备未打开
【发布时间】:2019-02-26 12:43:15
【问题描述】:

我正在开发 QtCreator,我想使用带有来自 QT Windows 的 xml 文件的 python 脚本。

文件已打开,但我无法使用脚本:

  QString p_stdout = _process.readAll();

告诉我:QIODevice::read (QProcess): 设备未打开

这是我的代码:

   // EXEC PYTHON SCRIPT


    QStringList args = (QStringList() << script_path << employesDesires << file_path) ; // parameters
    QString program = "Python";                                                         // program


    int exitCode = _process.execute( program, args );

    _process.waitForFinished(-1);

//      _process.open(QIODevice::OpenMode()) ;

    QString p_stdout = _process.readAll();

    QString s = QString::number(exitCode);

    ui->labelResult->setText(s);

exitCode 返回 0

我搜索了很多论坛,但找不到我能理解的解决方案..

【问题讨论】:

    标签: python xml qt qt-creator xls


    【解决方案1】:

    来自documentation、QProcess::execute...

    在一个新进程中使用参数参数启动程序程序,等待它完成,然后返回进程的退出代码。新进程写入控制台的任何数据都会转发给调用进程

    所以你永远不会看到QProcess 实例处于打开状态——在调用返回时它实际上已关闭。

    相反,您可能想使用QProcess::start...

    _process.start(program, args);
    

    这将作为调用者的子进程执行指定的进程,并通过各种读取通道提供其输出。

    另外,请注意虽然QProcess::waitForFinished 似乎是一个有用的例程,但通常最好连接到各种signals 并做出相应的反应——无论是处理错误还是从标准输出/标准错误等读取。

    【讨论】:

    • 对不起,我对文档的思考还不够。因此,如果我了解文档,使用 start() 函数,我可以从我的 python 脚本中检索数据,但不能使用 execute()。我会试试你的信息!我会及时通知你的。
    • 是的,差不多就是这样。 QProcess::execute 是一个static 成员函数,其行为或多或少类似于std::system:它启动指定的程序并等待它完成,因此在它返回之前没有任何类型的信息可用。另一方面,QProcess::start 只是安排请求的执行进程,并通过通常的Qt 信号/槽机制报告任何进度/输出/状态更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多