【发布时间】:2017-01-27 11:41:40
【问题描述】:
注意:标题并未准确表达问题,如有必要,请随时编辑
- 类和描述信息
- 问题
- 代码示例等
- TL;DR
1.信息:
我创建了一个名为m_Proc 的自定义QProcess 类。
#include "misc_serv"
using namespace misc_serv;
class GEN_SERVSHARED_EXPORT m_Proc : public QProcess
{
Q_OBJECT
public:
int exitCode = -1;
QString _out;
s_i_combo si;
QList<s_i_combo> sch_in_List;
m_Proc(QList<s_i_combo> i_s_list, QObject *parent = 0);
m_Proc(s_i_combo i_s_obj, QObject *parent);
m_Proc(QObject *parent);
void setProcessBlocks(s_i_combo _si);
void setProcessBlocks(QList<s_i_combo> _si_list);
~m_Proc() {}
private:
s_i_combo getSearchInput();
void initConnectors();
public slots:
void myReadyReadStandardOutput();
void myFinished(int i);
signals:
void finishedSignal();
};
这个类的目的是使用从 QProcess 父级发出的信号,这将允许我从 read*() 和 write() 到 QProcess。
当达到最终输出时,QProcess::finished(int) 连接到分配最终输出和退出代码QProcess 的方法
然后从m_Proc 发出一个信号,该信号将通知父类该信号命名(非常有创意)finishedSignal
m_Proc 由另一个名为 gen_serv 的父类处理。
#include "m_proc.h"
class GEN_SERVSHARED_EXPORT gen_serv : public QObject
{
Q_OBJECT
private:
QObject *parent;
QProcess *p;
int MSEC = 1000;
m_Proc *m;
int exitCode = -1;
QString _proc_out;
void init_connector();
private slots:
void getResults();
public:
gen_serv(QObject *_parent = new QObject());
virtual ~gen_serv();
void runCommand(const QString _prog);
void runCommand(const QString _prog, const QStringList args);
void runCommand(const QString _prog, const QString _sSearch, const QString _sInput);
void runCommand(const QString _prog, const QStringList args, const QString _sSearch, const QString _sInput);
void runCommand(const QString _prog, s_i_combo siCombo);
void runCommand(const QString _prog, const QStringList args, s_i_combo siCombo);
void runCommand(const QString _prog, QList<s_i_combo> siList);
void runCommand(const QString _prog, const QStringList args, QList<s_i_combo> siList);
QString getRunCommand_Output();
int getRunCommand_ExitCode();
QProcess* createProcess(QString cmd/*, int t_sec = 30*/);
};
gen_serv 为m_Proc 提供了多种“构造方法”。这些构造方法调用runCommand。这些构造函数及其参数允许各种处理能力,从基本程序执行到详细的 I/O 过程。
2。问题:
在我的 qt 控制台应用程序中,我创建了一个 gen_serv 对象,并使用它来“运行命令”,例如:
//main.cpp
gen_serv *gen_proc
gen_proc = new gen_serv();
gen_proc->runCommand("sh", QStringList()
<< "-c"
<< "echo sleeping; sleep 2; echo hello...");
qDebug() << gen_proc->_proc_out;
根据我的 m_Proc 的工作方式,它应该返回:“hello...”
上面要运行的命令与(据我了解)相同:
$ sh -c "echo sleeping; sleep 2; echo hello..."
sleeping
hello...
但是:它返回一个空的 QString,并且:
qDebug() << QString::number(gen_proc->exitCode);
输出:“-1”
3.额外的代码示例等 - 这让我相信:
问题不在于m_Proc,而在于我的父类gen_serv。
目前,在调用void gen_serv::runCommand() 之后,我运行QObject::connect() 如下所示(getResults() 只是获取_proc_out 和exitCode 并将它们分配给gen_serv 用于访问器方法):
QObject::connect(m, SIGNAL(finishedSignal()), this, SLOT(getResults()));
然而这是执行的,runCommand() 返回到main.cpp,其中qDebug() 立即调用gen_proc->_proc_out 并且qDebug() 将输出:
_gen_proc->_proc_out = ""
_gen_proc->exitcode = -1
4. TL;DR
我需要什么:
我需要设计一种在/或替换连接之后运行的方法(在gen_serv 中)。
这个方法会一直等到信号发出,所以调用QProcess.start()的runCommand()在发出来自m_Proc的finishedSignal之前不会返回,从而保证一个有效的输出/退出代码值.
有什么建议吗?
【问题讨论】:
标签: c++ qt signals-slots qprocess