问题描述
我想知道是否有人对此问题有答案。
我使用 QProcess 来启动 Powershell 脚本。 QProcess 的启动是从 QThread 发起的。该线程按预期完成,但 QProcess 从不调用其 readyReadStandardOutput()
信号或 finished()
信号。两者都绑定到 2 个不同的插槽,我可以看到脚本被执行,我也知道脚本以 exitCode 结束。
我的目标基本上是阅读我编写的 Powershell 脚本的退出代码。我尝试了不同的方法,但找不到获取 Powershell 脚本退出代码的解决方案,该脚本使用 cstdlib 函数 system() 或 QProcess 运行。所以我决定从标准输出读取它。为此,我会在退出脚本之前简单地打印 $LastExitCode
并从 C++ 程序中读取它。
提前致谢。
编辑:
更新示例:
main.cpp
#include <QtCore/QCoreApplication>
#include <QTextStream>
#include "ManagerClass.h"
int main(int argc,char *argv[])
{
QCoreApplication a(argc,argv);
QTextStream wrappedStream(stdin);
QString scriptPath;
if (argc < 2)
{
std::cout << "Path to script:" << "\n";
wrappedStream >> scriptPath;
}
ManagerClass manager(scriptPath);
return a.exec();
}
ManagerClass.h
#pragma once
#include <QObject>
#include <QProcess>
#include <iostream>
#include "ExecutionThread.h"
class ManagerClass : public QObject
{
Q_OBJECT
public:
ManagerClass(const QString& p_scriptPath,QObject *parent = nullptr);
~ManagerClass();
public slots:
void threadFinished();
void processstarted();
void processFinished(int exitCode,QProcess::ExitStatus exitStatus);
private:
ExecutionThread m_thread;
const QString SCRIPT_PATH;
};
ManagerClass.cpp
#include "ManagerClass.h"
ManagerClass::ManagerClass(const QString& p_scriptPath,QObject* parent)
: QObject(parent),SCRIPT_PATH(p_scriptPath)
{
m_thread.getProcesspointer();
m_thread.registerScriptPath(p_scriptPath);
QObject::connect(m_thread.getProcesspointer(),QOverload<int,QProcess::ExitStatus> ::of(&QProcess::finished),this,&ManagerClass::processFinished);
QObject::connect(m_thread.getProcesspointer(),&QProcess::started,&ManagerClass::processstarted);
QObject::connect(&m_thread,&ExecutionThread::finished,&ManagerClass::threadFinished);
m_thread.start();
}
ManagerClass::~ManagerClass() {}
void ManagerClass::processFinished(int exitCode,QProcess::ExitStatus exitStatus)
{
std::cout << " Process finished successfully." << "\n";
std::cin.get();
}
void ManagerClass::threadFinished()
{
std::cout << " Thread finished successfully." << "\n";
}
void ManagerClass::processstarted()
{
std::cout << " Process started." << "\n";
}
执行线程.h
#pragma once
#include <QThread>
#include <QProcess>
#include <iostream>
class ExecutionThread : public QThread
{
Q_OBJECT
public:
ExecutionThread();
~ExecutionThread();
void run();
void registerScriptPath(const QString& p_scriptPath);
QProcess* getProcesspointer();
signals:
void finished();
private:
QProcess* m_Process;
QString m_scriptPath;
};
ExecutionThread.cpp
#include "ExecutionThread.h"
ExecutionThread::ExecutionThread() : m_Process(new QProcess) {}
ExecutionThread::~ExecutionThread()
{
std::cout << "ExecutionThread::~ExecutionThread()";
}
void ExecutionThread::run()
{
QStringList commands;
m_Process->start(m_scriptPath,commands);
emit finished();
}
void ExecutionThread::registerScriptPath(const QString& p_scriptPath)
{
m_scriptPath = p_scriptPath;
}
QProcess* ExecutionThread::getProcesspointer()
{
return m_Process;
}
编辑:
我解决了我面临的问题,总是将 1 作为退出代码。
事实证明,我误解了 QProcess 的 Qt API。
当它完成时,我仍然没有从那个 QProcess 对象得到信号。
上面的示例使用 m_Process->start()
并且在给定的 powershell 脚本完成时没有信号。如前所述,m_Process->execute() 也不会发出任何信号。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)