一、需要完成的功能
在子对话框(CmdChildQt)中,点击 "执行" 按钮,将多个命令行指令,依次输入到父对话框(CmdQt)的编辑框中并且执行,要求如下:
- 在前一个命令执行完成后,获取命令行返回结果信息,根据结果信息判断,进行下一步操作;
- 当前一个命令执行成功后,继续自动输入下一个命令行指令到父对话框编辑框中执行,就这样依次执行多个命令行命令,达到命令执行自动化的目的。
二、实现方法
- 父对话框
cpp
class CmdQt : public QDialog
{
Q_OBJECT
signals:
void cmdFinished(QString qstr);
};
void CmdQt::slot_inputCommand()
{
}
void CmdQt::slot_SetCommandRetInfo(DATA_INFO info)
{
emit cmdFinished(qstr);
}
void CmdQt::setSignalExecCmdLine()
{
emit ui.leditInputCommand->returnPressed();
}
- 子对话框
cpp
class CmdChildQt :
public QDialog
{
Q_OBJECT
private:
QEventLoop loop;
QString m_qstrRecvCmdRetInfo;
signals:
void signal_sendQuit();
private slots:
void slot_RecvCmdRetInfo(QString qstrInfo);
};
void CmdChildQt::slot_RecvCmdRetInfo(QString qstrInfo)
{
m_qstrRecvCmdRetInfo = qstrInfo;
emit signal_sendQuit();
}
void CmdChildQt::slot_exec()
{
m_parent->setCmdLine(ui.editCmdSelect->text().trimmed());
connect(m_parent, &CmdQt::cmdFinished, this, &CmdChildQt::slot_RecvCmdRetInfo);
connect(this, &CmdChildQt::signal_sendQuit, &loop, &QEventLoop::quit);
m_parent->setSignalExecCmdLine();
loop.exec();
if (m_qstrRecvCmdRetInfo.contains("same string...") == false)
{
return;
}
...
m_parent->setCmdLine("command -param");
m_parent->setSignalExecCmdLine();
loop.exec();
if (m_qstrRecvCmdRetInfo.contains("same string...") == false)
{
return;
}
...
disconnect(m_parent, &CmdQt::cmdFinished, this, &CmdChildQt::slot_RecvCmdRetInfo);
disconnect(this, &CmdChildQt::signal_sendQuit, &loop, &QEventLoop::quit);
...
}
上述代码的主要逻辑:
- 链接信号和槽函数;
- 在子对话框中,获取命令行,并设置父对话框的编辑框为命令行指令,向父对话框编辑框发射 returnPressed 信号,槽函数 slot_inputCommand 被触发执行;
- 之后,slot_inputCommand 触发 slot_SetCommandRetInfo 执行;
- 在 slot_SetCommandRetInfo 中,发射 cmdFinished 信号,cmdFinished 信号触发 slot_RecvCmdRetInfo 执行;
- 在 slot_RecvCmdRetInfo 中,发射 signal_sendQuit 信号,signal_sendQuit 触发 QEventLoop::quit 执行;
- loop.exec() 返回,并执行之后的代码;
- 根据 m_qstrRecvCmdRetInfo 的值,进行下一步骤;如果,命令执行成功,继续执行下一个命令。