Qt6,使用 UI 界面完成命令执行自动化的设计

一、需要完成的功能

在子对话框(CmdChildQt)中,点击 "执行" 按钮,将多个命令行指令,依次输入到父对话框(CmdQt)的编辑框中并且执行,要求如下:

  1. 在前一个命令执行完成后,获取命令行返回结果信息,根据结果信息判断,进行下一步操作;
  2. 当前一个命令执行成功后,继续自动输入下一个命令行指令到父对话框编辑框中执行,就这样依次执行多个命令行命令,达到命令执行自动化的目的。

二、实现方法

  • 父对话框
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);

	...
}

上述代码的主要逻辑:

  1. 链接信号和槽函数;
  2. 在子对话框中,获取命令行,并设置父对话框的编辑框为命令行指令,向父对话框编辑框发射 returnPressed 信号,槽函数 slot_inputCommand 被触发执行;
  3. 之后,slot_inputCommand 触发 slot_SetCommandRetInfo 执行;
  4. 在 slot_SetCommandRetInfo 中,发射 cmdFinished 信号,cmdFinished 信号触发 slot_RecvCmdRetInfo 执行;
  5. 在 slot_RecvCmdRetInfo 中,发射 signal_sendQuit 信号,signal_sendQuit 触发 QEventLoop::quit 执行;
  6. loop.exec() 返回,并执行之后的代码;
  7. 根据 m_qstrRecvCmdRetInfo 的值,进行下一步骤;如果,命令执行成功,继续执行下一个命令。
相关推荐
BlackNight1687 个月前
Qt6 QSslSocket 客户端设计踩坑
c++ qt6
BlackNight1688 个月前
使用 Qt 设计师给工具栏添加图片按钮(来自ChatGPT)
c++ qt6
BlackNight1688 个月前
在进行Qt程序的国际化时,编写字符串应当注意以下几点(ChatGPT)
c++ qt6
BlackNight1681 年前
Qt designer中使用QSplitter创建推拉窗口,类似 Cobalt Strike 中主界面上下推拉的窗口
c++ qt6