name: qtwidget-instrument-control
description: 本技能帮助开发者使用Qt6和MSVC编译器创建标准的Widget桌面应用程序,支持RSVISA库集成进行仪器控制。当用户需要编写Qt应用程序、自动化测试程序、原生Qt程序(非PyQt)、SCPI指令发送及查询程序等,使用此Skill。
qtwidget-instrument-control
用于创建基于Qt6的实验室仪器控制应用程序的技能。
项目主结构
项目目录/
├── 项目名.pro # Qt项目配置
├── main.cpp # 应用程序入口
├── Mainwindow.h # 主窗口类声明
├── Mainwindow.cpp # 主窗口类实现
├── Mainwindow.ui # 主界面文件
├── Devices├── DeviceHelper.h # 所有设备类的基类, 实现设备连接、断开、发送和接收指令等├── DeviceXXX.h # 用户希望实现的具体仪器对象, 继承DeviceHelper
├── Widgets # 存放所有界面├── WidgetHomePage # QTableWidget的第一个界面头文件,存放h文件、cpp文件、ui文件,声明项目的连接、断开等├── WidgetName1 # 用户希望实现的第1个测试项,如手动测试,里面存放h文件、cpp文件、ui文件├── WidgetName2 # 用户希望实现的第2个测试项,如自动化测试,里面存放h文件、cpp文件、ui文件
├── QsLog # 自定义日志类,可输出到控制台或文件,默认输出到文件,使用时包含Zlog.h即可
├── Include # 有必要时可生成一个Includes.h文件在此,存放工程公共定义、枚举、结构体、其他数据结构等
└── Rsvisa/ # RSVISA库├── x64/├── include/│ ├── RsVisaLoader.h│ ├── visa.h # visa入口文件│ ├── visatype.h│ └── vpptype.h└── lib/├── RsVisa32.lib├── RsVisaLoader.lib└── Visa32.lib
要求:
- 生成原生Qt Widget程序
- 必须严格按照生成上述项目主结构,不得缺失任何文件夹
- Devices文件夹里的所有仪器类必须继承DeviceHelper类
- Widgets里至少要有WidgetHomePage类,实现仪器的连接和断开相关控件;每增加一种测试项就增加一个类WidgetNameX,类名根据需求定义
- 主界面Mainwindow.ui为水平布局,左边为QTableWidget(动态存放各界面),右边为QTextEdit(显示程序日志)
- QTableWidget的第一个tab界面必须是Widgets文件夹下的WidgetHomePage类
- QTableWidget的其他tab界面根据测试需求决定,每种需求对应在Widgets文件夹下创建一个WidgetNameX类并加载到QTableWidget其他tab界面中
- QTextEdit所有界面都能看到
工程模板使用
- 请直接复制templates中的文件到新工程,在此基础上进行代码扩充
- 复制文件直接使用操作系统的控制台命令(如xcopy),禁止通过读取文件内容再写入新文件的低效方式
- 禁止私自修改模板文件(只能调整注释),包括Qslog下所有文件、DeviceHelper类文件、rsvisa下所有文件
- 分析需求,需要在Devices下创建什么仪器类、需要在Widgets下创建什么测试界面类,再去执行
关于界面实现
- 所有控件使用代码动态生成,禁止通过修改ui文件来实现布局
- 使用到的控件,必须include其头文件
- 严格参考reference中的UI_GUIDELINES.md进行界面实现
日志的使用
main.cpp里初始化:
#include "Zlog.h" //引入头文件
int main(int argc, char *argv[])
{//...// 日志对象初始化if(LOG_DEST_FILE) //此宏已定义在 Zlog.h 中,1代表存入文件 0代表存入控制台{ZLog::getInstance()->setDestIsFile(QApplication::applicationDirPath() + LOG_PATH,LOG_FILE_SIZE,LOG_FILE_COUNT);ZLog::getInstance()->setLoggingLevel(InfoLevel);ZLOG_INFO() << "#######Application Start#######";ZLOG_INFO() << "zlog inited, log will be append to file";}else{ZLog::getInstance()->setDestIsCmd();ZLog::getInstance()->setLoggingLevel(InfoLevel);ZLOG_INFO() << "#######Application Start#######";ZLOG_INFO() << "zlog inited, log just append to cmd";}//...
}
在需要的引入头文件:
#include "Zlog.h"
使用:
ZLOG_INFO() << "zlog inited, log just append to cmd";
ZLOG_WARN() << "paras count is 0";
ZLOG_ERROR() << "viOpenDefaultRM failed:" << errorCode;
//...
代码注释
头文件注释
/*!* 公司:成都威频科技有限公司* 作用:设备基础类, 提供基本的虚拟仪器对象, 完成设备查找以及指令收发* 时间:2026-01-16* 作者:zhuxiaoyong* 修改1:内容/时间/作者* 修改2:内容/时间/作者
*/
函数声明注释
/*** @brief 模板函数, 执行异步任务** @param taskName 任务名称 "查找设备"* @param taskFunc 需要执行的任务* @return* @note* @exception*/
代码注释
void ClassName::functionName()
{//[1] 读取文件到内存//[2] 指标个数有效判断//[3] 获取差分对名称,也是文件名称,这里有个风险:如果用户希望差分对名称和文件名称不一样需要改动很多地方//[4] 本文件的阈值判断结果//[5] 依次计算结果//[6] 创建算法//[7] 通知UI更新trace//[8] 计算阈值//[9] 组装结果
}
命名规范
-
总体上使用驼峰命名法
-
成员变量使用m_xxxXXX
字符编码
在MSVC环境下,确保源文件使用UTF-8编码。
C++17特性使用
使用C++17。
工程编译
不需要构建、编译工程,代码编写完成即可。
@@@@@@@@@@@@@@@@@@@分页符@@@@@@@@@@@@@@@@@@@
reference/UI_GUIDELINES.md:
Qt Widget 界面设计规范
最高原则
所有控件代码自动生成 ,禁止修改ui文件。
1. 布局原则
1.1 布局管理器使用
- 优先使用 Qt 布局管理器(QGridLayout > QHBoxLayout > QVBoxLayout)
- 避免使用绝对定位(setGeometry)
- 布局嵌套不超过3层
1.2 间距规范
| 布局类型 | 间距 (px) | 边距 (px) |
|---|---|---|
| 外层容器 | 12 | 16 |
| 内层容器 | 8 | 8 |
| 控件之间 | 8-12 | - |
1.3 对齐方式
- 标签右对齐,控件左对齐
- 同行控件垂直居中对齐
- 按钮组使用统一对齐方式
2. 控件规范
2.1 按钮规范
- 最小宽度:80px
- 最大宽度:150px
- 高度:30px
- 文本居中显示
- 图标按钮大小:24x24px
2.2 输入控件规范
| 控件类型 | 最小宽度 | 最大宽度 | 高度 |
|---|---|---|---|
| QLineEdit | 150px | 300px | 28px |
| QComboBox | 150px | 250px | 28px |
| QSpinBox | 80px | 120px | 28px |
| QCheckBox | - | - | 24px |
2.3 标签规范
- 字体大小:12-14px
- 字体粗细:常规
- 颜色:#333333
- 标签与控件间距:8px
3. 视觉设计
3.1 颜色方案
主色调:#1E90FF (DodgerBlue)
成功色:#228B22 (ForestGreen)
警告色:#FF8C00 (DarkOrange)
错误色:#DC143C (Crimson)
背景色:#F5F5F5 (WhiteSmoke)
文本色:#333333
边框色:#E0E0E0
3.2 状态指示器
- 未连接:红色 (#DC143C)
- 已连接:绿色 (#228B22)
- 处理中:橙色 (#FF8C00)
3.3 字体规范
标题:14px, 粗体
正文:12px, 常规
按钮文本:12px, 常规
日志文本:11px, 等宽字体
4. 交互设计
4.1 按钮状态
- 可点击:正常状态,hover时有高亮效果
- 不可点击:灰色禁用状态,透明度50%
4.2 日志显示
- 时间戳格式:
[yyyy-MM-dd hh:mm:ss] - 日志级别颜色:
- INFO:默认黑色
- WARN:橙色
- ERROR:红色
4.3 响应式设计
- 窗口最小尺寸:800x600
- 控件支持缩放自适应
- 布局支持拉伸
5. 布局模板
5.1 主页布局(设备连接)
┌─────────────────────────────────────────────────────────────┐
│ [刷新设备列表] │
├─────────────────────────────────────────────────────────────┤
│ N5247B: [下拉选择框] [连接] [断开] [状态: ■] │
│ PEU32A: [下拉选择框] [连接] [断开] [状态: ■] │
└─────────────────────────────────────────────────────────────┘
5.2 功能页布局
┌─────────────────────────────────────────────────────────────┐
│ 【设备名称】操作: │
├─────────────────────────────────────────────────────────────┤
│ 标签1: [输入框] [复选框] [按钮] │
│ [按钮] │
│ 标签2: [输入框] [按钮] │
├─────────────────────────────────────────────────────────────┤
│ 【设备名称】操作: │
├─────────────────────────────────────────────────────────────┤
│ 标签: [输入框/下拉框] [按钮] [按钮] │
│ [按钮] │
└─────────────────────────────────────────────────────────────┘
5.3 主窗口布局
┌─────────────────────────────────────────────────────────────┐
│ ┌──────────────────┐ ┌────────────────────────────────┐ │
│ │ Tab 1 │ │ │ │
│ │ Tab 2 │ │ 日志显示区域 │ │
│ │ Tab 3 │ │ (固定宽度300px) │ │
│ ├──────────────────┤ │ │ │
│ │ │ │ │ │
│ │ 内容区域 │ │ │ │
│ │ │ │ │ │
│ │ │ └────────────────────────────────┘ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘
6. 代码规范
6.1 命名规则
// 控件命名:前缀 + 描述
QPushButton* m_btnConnect; // 按钮
QLineEdit* m_leInput; // 输入框
QComboBox* m_cmbDevice; // 下拉框
QLabel* m_lblStatus; // 标签
QSpinBox* m_spinPort; // 数字输入
QCheckBox* m_chkOption; // 复选框
QTextEdit* m_textLog; // 文本编辑
QTabWidget* m_tabWidget; // Tab控件
6.2 初始化顺序
- 创建布局管理器
- 创建控件并设置属性
- 添加控件到布局
- 连接信号槽
- 设置初始状态
6.3 信号槽命名
// 槽函数命名:on + 控件名 + 事件
void onBtnConnectClicked();
void onCmbDeviceCurrentIndexChanged(int index);
void onLeInputTextChanged(const QString& text);
7. 示例代码
void initUI() {// 创建布局auto* layout = new QGridLayout(this);layout->setSpacing(8);layout->setContentsMargins(16, 16, 16, 16);// 创建标签auto* lblDevice = new QLabel("设备:", this);lblDevice->setAlignment(Qt::AlignRight | Qt::AlignVCenter);// 创建下拉框m_cmbDevice = new QComboBox(this);m_cmbDevice->setMinimumWidth(150);// 创建按钮m_btnConnect = new QPushButton("连接", this);m_btnConnect->setMinimumWidth(80);m_btnConnect->setEnabled(false);// 添加到布局layout->addWidget(lblDevice, 0, 0);layout->addWidget(m_cmbDevice, 0, 1);layout->addWidget(m_btnConnect, 0, 2);// 连接信号槽connect(m_btnConnect, &QPushButton::clicked, this, &MyWidget::onBtnConnectClicked);
}
8. 检查清单
@@@@@@@@@@@@@@@@@@@分页符@@@@@@@@@@@@@@@@@@@
templates:

