























name: qtwidget-instrument-control
description: 本技能帮助开发者使用Qt6和MSVC编译器创建标准的Widget桌面应用程序,支持RSVISA库集成进行仪器控制。当用户需要编写Qt应用程序、自动化测试程序、原生Qt程序(非PyQt)、SCPI指令发送及查询程序等,使用此Skill。
用于创建基于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
要求:
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。
不需要构建、编译工程,代码编写完成即可。
@@@@@@@@@@@@@@@@@@@分页符@@@@@@@@@@@@@@@@@@@
reference/UI_GUIDELINES.md:
所有控件代码自动生成 ,禁止修改ui文件。
| 布局类型 | 间距 (px) | 边距 (px) |
|---|---|---|
| 外层容器 | 12 | 16 |
| 内层容器 | 8 | 8 |
| 控件之间 | 8-12 | - |
| 控件类型 | 最小宽度 | 最大宽度 | 高度 |
|---|---|---|---|
| QLineEdit | 150px | 300px | 28px |
| QComboBox | 150px | 250px | 28px |
| QSpinBox | 80px | 120px | 28px |
| QCheckBox | - | - | 24px |
主色调:#1E90FF (DodgerBlue)
成功色:#228B22 (ForestGreen)
警告色:#FF8C00 (DarkOrange)
错误色:#DC143C (Crimson)
背景色:#F5F5F5 (WhiteSmoke)
文本色:#333333
边框色:#E0E0E0
标题:14px, 粗体
正文:12px, 常规
按钮文本:12px, 常规
日志文本:11px, 等宽字体
[yyyy-MM-dd hh:mm:ss]┌─────────────────────────────────────────────────────────────┐
│ [刷新设备列表] │
├─────────────────────────────────────────────────────────────┤
│ N5247B: [下拉选择框] [连接] [断开] [状态: ■] │
│ PEU32A: [下拉选择框] [连接] [断开] [状态: ■] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 【设备名称】操作: │
├─────────────────────────────────────────────────────────────┤
│ 标签1: [输入框] [复选框] [按钮] │
│ [按钮] │
│ 标签2: [输入框] [按钮] │
├─────────────────────────────────────────────────────────────┤
│ 【设备名称】操作: │
├─────────────────────────────────────────────────────────────┤
│ 标签: [输入框/下拉框] [按钮] [按钮] │
│ [按钮] │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ┌──────────────────┐ ┌────────────────────────────────┐ │
│ │ Tab 1 │ │ │ │
│ │ Tab 2 │ │ 日志显示区域 │ │
│ │ Tab 3 │ │ (固定宽度300px) │ │
│ ├──────────────────┤ │ │ │
│ │ │ │ │ │
│ │ 内容区域 │ │ │ │
│ │ │ │ │ │
│ │ │ └────────────────────────────────┘ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘
// 控件命名:前缀 + 描述
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控件
// 槽函数命名:on + 控件名 + 事件
void onBtnConnectClicked();
void onCmbDeviceCurrentIndexChanged(int index);
void onLeInputTextChanged(const QString& text);
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);
}
@@@@@@@@@@@@@@@@@@@分页符@@@@@@@@@@@@@@@@@@@
templates:

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。