当前位置: 首页 > news >正文

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

一、需要完成的功能

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

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

二、实现方法

  • 父对话框
class CmdQt : public QDialog
{Q_OBJECTsignals: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();
}
  • 子对话框
class CmdChildQt :public QDialog
{Q_OBJECTprivate: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 的值,进行下一步骤;如果,命令执行成功,继续执行下一个命令。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python爬取Web of science论文信息
  • 不学51直接学stm32可以吗?学stm32需要哪些基础?
  • 视频批量混剪剪辑软件类似剪映设计一个模板后, 视频,图片,文字,转场,音频,特效都可以系统随机
  • 基于STM32+华为云IOT设计的火灾感知系统
  • React进阶之路(一)-- JSX基础、组件基础
  • tikv节点缩容下线,Tombstone状态处理 和TIDB升级
  • 机器人制作开源方案 | 管内检测维护机器人
  • 【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存
  • 使用JavaScript编写的爬虫程序
  • 公共功能测试用例
  • 持续持续集成部署-k8s-配置与存储-配置管理:Secret 的应用
  • Harbor私有仓库
  • 一键批量视频剪辑、合并,省时省力,制作专业视频
  • 基于Python OpenCV的金铲铲自动进游戏、D牌...
  • 智能语音和自然语言处理技术
  • 【刷算法】从上往下打印二叉树
  • avalon2.2的VM生成过程
  • ES6 ...操作符
  • hadoop集群管理系统搭建规划说明
  • in typeof instanceof ===这些运算符有什么作用
  • Python 基础起步 (十) 什么叫函数?
  • Spark RDD学习: aggregate函数
  • SQLServer之创建显式事务
  • Vue 动态创建 component
  • 阿里云Kubernetes容器服务上体验Knative
  • 对JS继承的一点思考
  • 高度不固定时垂直居中
  • 好的网址,关于.net 4.0 ,vs 2010
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何学习JavaEE,项目又该如何做?
  • 三分钟教你同步 Visual Studio Code 设置
  • 源码安装memcached和php memcache扩展
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​香农与信息论三大定律
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (2.2w字)前端单元测试之Jest详解篇
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (52)只出现一次的数字III
  • (7)svelte 教程: Props(属性)
  • (LeetCode C++)盛最多水的容器
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (二)windows配置JDK环境
  • (二)正点原子I.MX6ULL u-boot移植
  • (力扣)1314.矩阵区域和
  • (四)React组件、useState、组件样式
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)shell调试方法
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core 控制台应用程序读取配置文件app.config