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

qt实践教学(编写一个代码生成工具)持续更新至完成———

前言:

我的想法是搭建一个和STM32cubemux类似的图形化代码生成工具,可以把我平时用到的代码整合一下全部放入这个软件中,做一个我自己专门的代码生成工具,我初步的想法是在下拉选框中拉取需要配置的功能,然后就弹出对应的脚位图,只需要点击芯片上的脚位就可以配置对应的端口的功能,大家有好的建议欢迎指正。本工具实时更新到完成为止,我会实时更新进度和制作中遇到的问题和想法。

1.界面编写

界面大概框架布局,

界面的搭建可以参考下面链接的教程

第一部分 学习Qt必备知识 · Qt 快速入门系列教程

  • 搭建好后,首先实现新建文件,保存文件,打开文件对应的功能。

选择新建动作,右击点击转到槽

选择triggered()//触发时机:当用户通过点击、快捷键等方式显式触发动作时(例如点击菜单项或工具栏按钮)

会在mainwindow.cpp自动生成一个槽函数

我们在该该函数里写上新建的代码

void MainWindow::on_action_N_triggered()
{// 弹出文件对话框,让用户选择保存路径和文件名QString fileName = QFileDialog::getSaveFileName(this,"保存文件",QDir::homePath(),  // 默认保存到用户主目录"文本文件 (*.c);;所有文件 (*)");if (fileName.isEmpty()) {QMessageBox::warning(this, "警告", "未选择文件名!");return;}// 使用 QFile 创建文件QFile file(fileName);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream stream(&file);stream << "这是一个新创建的文件\n";  // 写入初始内容file.close();QMessageBox::information(this, "成功", "文件已创建:" + fileName);} else {QMessageBox::critical(this, "错误", "无法创建文件:" + fileName);}}

就实现了新建的功能

然后实现保存功能

点击保存动作右击转到槽

选择triggered()

在槽函数里写上保存的代码,现在保存的是TextEdit控件中的文本,之后再进行调整

void MainWindow::on_saveButton_clicked()
{// 弹出文件保存对话框QString fileName = QFileDialog::getSaveFileName(this,"保存文件",QDir::homePath(),"文本文件 (*.txt);;所有文件 (*)");if (fileName.isEmpty()) {QMessageBox::warning(this, "警告", "未选择保存路径!");return;}// 打开文件并写入 QTextEdit 的内容QFile file(fileName);if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream stream(&file);stream << ui->textEdit->toPlainText();  // 获取 QTextEdit 的文本内容file.close();QMessageBox::information(this, "成功", "文件已保存!");} else {QMessageBox::critical(this, "错误", "无法保存文件!");}
}

我们先来设置主要的功能,就是点击配置选项的多选框,自动弹出芯片,并标出可选配置的脚位

下拉选项条转到槽填上以下代码

void MainWindow::on_comboBox_activated(int index)//芯片选择
{// 获取当前选项的图片路径标识QString imageName = ui->comboBox->itemData(index).toString();// 假设图片存放在可执行文件同级目录的 images 文件夹下QString imagePath = ":/myimages/MCU/" + imageName;// 加载图片QPixmap pixmap(imagePath);if (pixmap.isNull()) {qDebug() << "无法加载图片:" << imagePath;ui-> picture->setText("图片加载失败");return;}// 显示图片(自动缩放适应 QLabel)ui->picture->setPixmap(pixmap.scaled(ui->picture->size(), Qt::KeepAspectRatio));
}

然后初始化下拉框的值

 ui->comboBox->addItem("SC8P052", "SC8P052.png");ui->comboBox->addItem("SC8P054", "SC8P054.png");ui->comboBox->addItem("SC8P054_16A", "SC8P054_16A.png");ui->comboBox->addItem("SC8P062BD", "SC8P062BD.png");ui->comboBox->addItem("SC8P062BD_14A", "SC8P062BD_14A.png");ui->comboBox->addItem("SC8P8022D", "SC8P8022D.png");ui->comboBox->addItem("SC8P8122", "SC8P8122.png");ui->comboBox->addItem("MC30P6250", "MC30P6250.png");ui->comboBox->addItem("MC30P6280", "MC30P6280.png");ui->comboBox->addItem("P02", "P02.png");ui->comboBox->addItem("P04", "P04.png");ui->comboBox->addItem("SC8F073", "SC8F073.png");ui->comboBox->addItem("SC8F073_16A", "SC8F073_16A.png");

这是导入的图片文件

如何导入看这篇文章

Qt--导入整个目录的资源_现成的qt项目文件怎么导入进去-CSDN博客

我的设置完后,选择哪个芯片就会弹出对应的芯片脚位图

但是出来的图片有些模糊,可能是拉伸的比列不对,直接显示在界面上也有点占空间,我们把它变为浮窗的模式,下面是没有修改前的模式

 创建一个新的界面,用来显示浮窗

FloatImageDialog.h.h文件

#ifndef FLOATIMAGEDIALOG_H
#define FLOATIMAGEDIALOG_H#include <QDialog>
#include <QLabel>
#include <QPixmap>class FloatImageDialog : public QDialog
{Q_OBJECTpublic:explicit FloatImageDialog(const QString &imagePath, QWidget *parent = nullptr);~FloatImageDialog();
private:QLabel *imageLabel;  // 用于显示图片的标签
};#endif // FLOATIMAGEDIALOG_H
FloatImageDialog.cpp文件
#include "FloatImageDialog.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QMouseEvent>  //
FloatImageDialog::FloatImageDialog(const QString &imagePath, QWidget *parent): QDialog(parent)
{// 设置窗口属性:无边框、置顶、透明背景(可选)setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);setAttribute(Qt::WA_TranslucentBackground);  // 如果需要透明背景// 加载图片QPixmap pixmap(imagePath);if (pixmap.isNull()) {qDebug() << "无法加载图片:" << imagePath;return;}// 创建控件imageLabel = new QLabel(this);imageLabel->setPixmap(pixmap.scaled(400, 400, Qt::KeepAspectRatio, Qt::SmoothTransformation));// 可选:添加关闭按钮QPushButton *closeButton = new QPushButton("关闭", this);connect(closeButton, &QPushButton::clicked, this, &FloatImageDialog::close);// 布局QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(imageLabel);layout->addWidget(closeButton);
}FloatImageDialog::~FloatImageDialog() {}void FloatImageDialog::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {dragPosition = event->globalPos() - frameGeometry().topLeft();event->accept();}
}void FloatImageDialog::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() & Qt::LeftButton) {move(event->globalPos() - dragPosition);event->accept();}
}

主函数MainWindow.h中加入头文件

#include "FloatImageDialog.h"  // 包含自定义对话框头文件

转到用来隐藏显示MCU的槽函数

写入以下代码

   if (!floatDialog) {// 创建浮动窗口(传入图片资源路径)floatDialog = new FloatImageDialog(":/images/SC8P052.png", this);floatDialog->show();} else {// 关闭并释放浮动窗口floatDialog->close();delete floatDialog;floatDialog = nullptr;}

实现了芯片图片在另一个窗口显示并可以拖动

给它初始化固定在右侧,用以下代码时不要忘记头文件#include <QScreen>

void MainWindow::onToggleFloatWindow()
{if (!floatDialog) {// 创建浮动窗口floatDialog = new FloatImageDialog(":/images/SC8P052.png", this);// 获取主窗口的屏幕位置和尺寸QRect mainGeometry = this->geometry();// 计算浮动窗口的初始位置(主窗口右侧 + 10 像素)int x = mainGeometry.right() + 10;int y = mainGeometry.top();// 获取屏幕的可用区域(避免窗口超出屏幕)QScreen *screen = QGuiApplication::primaryScreen();QRect screenGeometry = screen->availableGeometry();// 如果浮动窗口超出屏幕右侧,调整到屏幕边缘int maxX = screenGeometry.right() - floatDialog->width();if (x > maxX) {x = maxX;}// 设置浮动窗口位置floatDialog->move(x, y);floatDialog->show();} else {// 关闭并释放浮动窗口floatDialog->close();delete floatDialog;floatDialog = nullptr;}
}

窗口跟随移动

// MainWindow.h
protected:void moveEvent(QMoveEvent *event) override;// MainWindow.cpp
void MainWindow::moveEvent(QMoveEvent *event)
{QMainWindow::moveEvent(event);if (floatDialog) {// 主窗口移动时更新浮动窗口位置QRect mainGeometry = geometry();int x = mainGeometry.right() + 10;int y = mainGeometry.top();floatDialog->move(x, y);}
}

持续更新中————————

相关文章:

qt实践教学(编写一个代码生成工具)持续更新至完成———

前言&#xff1a; 我的想法是搭建一个和STM32cubemux类似的图形化代码生成工具&#xff0c;可以把我平时用到的代码整合一下全部放入这个软件中&#xff0c;做一个我自己专门的代码生成工具&#xff0c;我初步的想法是在下拉选框中拉取需要配置的功能&#xff0c;然后就弹出对…...

设置 CursorRules 规则

为什么要设置CursorRules&#xff1f; 设置 CursorRules 可以帮助优化代码生成和开发流程&#xff0c;提升工作效率。具体的好处包括&#xff1a; 1、自动化代码生成 &#xff1a;通过定义规则&#xff0c;Cursor 可以根据你的开发需求自动生成符合规定的代码模板&#xff0c…...

AI 芯片全解析:定义、市场趋势与主流芯片对比

1. 引言&#xff1a;什么是 AI 芯片&#xff1f; 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;AI 计算的需求不断增长&#xff0c;从云计算到边缘计算&#xff0c;AI 芯片成为推动智能化时代的核心动力。那么&#xff0c;什么样的芯片才算 AI 芯片&#xff…...

Axure高保真Element框架元件库

点击下载《Axure高保真Element框架元件库》 原型效果&#xff1a;https://axhub.im/ax9/9da2109b9c68749a/#g1 摘要 本文详细阐述了在 Axure 环境下打造的一套高度还原 Element 框架的组件元件集。通过对 Element 框架组件的深入剖析&#xff0c;结合 Axure 的强大功能&#…...

21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>

PS&#xff1a; 开闭原则 定义和背景 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;&#xff0c;也称为开放封闭原则&#xff0c;是面向对象设计中的一个基本原则。该原则强调软件中的模块、类或函数应该对扩展开放&#xff0c;对修改封闭。这意味着一个软件实体…...

【2025年后端开发终极指南:云原生、AI融合与性能优化实战】

一、2025年后端开发的五大核心趋势 1. 云原生架构的全面普及 云原生&#xff08;Cloud Native&#xff09;已经成为企业级应用的核心底座。通过容器化技术&#xff08;DockerKubernetes&#xff09;和微服务架构&#xff0c;开发者能够实现应用的快速部署、弹性伸缩和故障自愈…...

Docker新手入门(持续更新中)

一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像&#xff0c;创建并运行镜像的容器&#xff0c;从而快速部署应用。 所谓镜像&#xff0c;就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器&#xff0c;为每个镜像的应用进程创建…...

微信小程序读取写入NFC文本,以及NFC直接启动小程序指定页面

一、微信小程序读取NFC文本(yyy优译小程序实现),网上有很多通过wx.getNFCAdapter方法来监听读取NFC卡信息,但怎么处理读取的message文本比较难找,现用下面方法来实现,同时还解决几个问题,1、在回调方法中this.setData不更新信息,因为this的指向问题,2、在退出页面时,…...

【Spring Boot 应用开发】-05 命令行参数

Spring Boot 常用命令行参数 Spring Boot 支持多种命令行参数&#xff0c;这些参数可以在启动应用时通过命令行直接传递。以下是一些常用的命令行参数及其详细说明&#xff1a; 1. 基本配置参数 --server.port端口号 指定应用程序运行的HTTP端口&#xff0c;默认为8080。 jav…...

选择研究方向(28条)DeepSeek提示词

选择研究方向&#xff08;28条&#xff09; 在学术研究的旅程中&#xff0c;确定研究方向和主题是至关重要的第一步。一个明确且具有创新性的研究主题不仅能够为研究提供清晰的方向&#xff0c;还能激发研究者的热情和动力。以下是一些优化后的提示词&#xff0c;目的在于帮助…...

Linux中读写锁详细介绍

读写锁介绍 Linux 中的读写锁&#xff08;Read-Write Lock&#xff09;是一种用于线程同步的机制&#xff0c;它允许多个线程同时读取共享资源&#xff0c;但只允许一个线程写入共享资源。这种机制在读操作远多于写操作的场景下&#xff0c;可以显著提高并发性能。读写锁主要有…...

flink分布式事务 - 两阶段提交

分布式事务与两阶段提交协议详解 分布式事务是分布式系统中保证数据一致性和可靠性的核心技术之一。在大数据处理、微服务架构以及实时流处理等领域,分布式事务的应用场景越来越广泛。两阶段提交协议(Two-Phase Commit, 2PC)作为一种经典的分布式事务管理协议,在保证强一致…...

《DataWorks:为人工智能算法筑牢高质量数据根基》

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅猛发展深刻地改变着各个行业的面貌。从智能推荐系统到医疗影像诊断&#xff0c;从自动驾驶到自然语言处理&#xff0c;AI正以前所未有的速度渗透到我们生活和工作的方方面面。而在这一系列AI应用的背后…...

机器学习(五)

一&#xff0c;多类&#xff08;Multiclass&#xff09; 多类是指输出不止有两个输出标签&#xff0c;想要对多个种类进行分类。 Softmax回归算法&#xff1a; Softmax回归算法是Logistic回归在多类问题上的推广&#xff0c;和线性回归一样&#xff0c;将输入的特征与权重进行…...

DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!

今天跟大家分享下我们如何将DeepSeek生成的VBA代码&#xff0c;做成按钮&#xff0c;将其永久保存在我们的Excel表格中&#xff0c;下次遇到类似的问题&#xff0c;直接在Excel中点击按钮&#xff0c;就能10秒搞定&#xff0c;操作也非常的简单. 一、代码准备 代码可以直接询问…...

利用Git和wget批量下载网页数据

一、Git的下载&#xff08;参考文章&#xff09; 二. wget下载&#xff08;网上很多链接&#xff09; 三、git和wget结合使用 1.先建立一个文本&#xff0c;将代码写入文本&#xff08;代码如下&#xff09;&#xff0c;将txt后缀改为sh&#xff08;download_ssebop.sh&#xf…...

人工智能之数学基础:线性代数中的行列式的介绍

本文重点 行列式是一种重要的数学工具,更是连接众多数学概念和实际应用的桥梁。本文将介绍矩阵的行列式,你可以把它看成对方阵的一种运算,将方阵映射成一个标量。 行列式的定义 行列式是一个由数值组成的方阵所确定的一个标量值。对于一个n*n的矩阵A=(aij),其行列式记为d…...

[自然语言处理]pytorch概述--什么是张量(Tensor)和基本操作

pytorch概述 PyTorch 是⼀个开源的深度学习框架&#xff0c;由 Facebook 的⼈⼯智能研究团队开发和维护&#xff0c;于2017年在GitHub上开源&#xff0c;在学术界和⼯业界都得到了⼴泛应⽤ pytorch能做什么 GPU加速自动求导常用网络层 pytorch基础 量的概念 标量&#xf…...

[杂学笔记]HTTP1.0和HTTP1.1区别、socket系列接口与TCP协议、传输长数据的时候考虑网络问题、慢查询如何优化、C++的垃圾回收机制

目录 1.HTTP1.0和HTTP1.1区别 2.socket系列接口与TCP协议 3.传输长数据的时候考虑网络问题 4.慢查询如何优化 5.C的垃圾回收机制 1.HTTP1.0和HTTP1.1区别 在连接方式上&#xff0c;HTTP1.0默认采用的是短链接的方式&#xff0c;就建立一次通信&#xff0c;也就是说即使在…...

电商主图3秒法则

‌1. 基础铁律‌ ▸ 首图点击率曝光量/点击量 ▸ 黄金3秒&#xff1a;触发冲动 > 信息堆砌 ‌2. 必守三原则‌ ✔ ‌单点爆破‌ → 1核心功能 > 10卖点叠加(反例&#xff1a;电子类目点击率↓18%) ✔ ‌场景植入‌ → 带场景主图点击率↑34%(数据源&#xff1a;20…...

DeepSeek DeepEP学习(一)low latency dispatch

背景 为了优化延迟&#xff0c;low lantency使用卡间直接收发cast成fp8的数据的方式&#xff0c;而不是使用normal算子的第一步执行机间同号卡网络发送&#xff0c;再通过nvlink进行转发的两阶段方式。进一步地&#xff0c;normal算子的dispatch包含了notify_dispatch传输meta…...

Metal学习笔记十:光照基础

光和阴影是使场景流行的重要要求。通过一些着色器艺术&#xff0c;您可以突出重要的对象、描述天气和一天中的时间并设置场景的气氛。即使您的场景由卡通对象组成&#xff0c;如果您没有正确地照亮它们&#xff0c;场景也会变得平淡无奇。 最简单的光照方法之一是 Phong 反射模…...

Wpf-ReactiveUI-Usercontrol交互

文章目录 1、使用属性绑定UserControl 部分(MyUserControl.xaml.cs)UserControl 视图模型部分(MyUserControlViewModel.cs)主界面部分(MainWindow.xaml)主界面视图模型部分(MainWindowViewModel.cs)2、使用消息传递UserControl 视图模型部分(MyUserControlViewModel.c…...

报告分享 | 哈工大赛尔实验室——大模型时代的具身智能

本报告详细介绍了大模型时代的具身智能&#xff0c;探讨了智能机器人的发展历程、技术挑战和未来发展方向。&#xff08; 报告全文下载&#xff1a;具身大模型关键技术与应用&#xff08;哈尔滨工业大学社会计算与信息检索研究中心&#xff09;.pdf&#xff01;&#xff09;...

机器学习校招面经二

快手 机器学习算法 一、AUC&#xff08;Area Under the ROC Curve&#xff09;怎么计算&#xff1f;AUC接近1可能的原因是什么&#xff1f; 见【搜广推校招面经四】 AUC 是评估分类模型性能的重要指标&#xff0c;用于衡量模型在不同阈值下区分正负样本的能力。它是 ROC 曲线…...

第四十一:Axios 模型的 get ,post请求

Axios 的 get 请求方式 9.双向数据绑定 v-model - 邓瑞编程 Axios 的 post 请求方式&#xff1a;...

全国青少年航天创新大赛各项目对比分析

全国青少年航天创新大赛各项目对比分析 一、比赛场地对比 项目名称场地尺寸场地特点组别差异筑梦天宫虚拟三维场景动态布局&#xff0c;小学组3停泊处&#xff0c;初高中组6停泊处&#xff1b;涉及传送带、机械臂、传感器等虚拟设备。初中/高中组任务复杂度更高&#xff0c;运…...

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式 2025/3/4 16:47 缘起&#xff1a;128GB的TF卡&#xff0c;只能格式化为NTFS/exFAT/ext4。 在飞凌的OK3588-C下&#xff0c;NTFS格式只读。 exFAT需要改内核来支持。 现在只剩下ext4了。 linux R4默认不支持exFAT…...

服务器配置-从0到分析4:ssh免密登入

该部分涉及到公钥、私钥等部分knowledge&#xff0c;本人仅作尝试 若将本地机器 SSH Key 的公钥放到远程主机&#xff0c;就能无需密码直接远程登录远程主机 1&#xff0c;在客户端生成 ssh 公私钥&#xff1a; 也就是我们本地机器&#xff0c;windows电脑 一路回车即可&am…...

React 组件基础介绍

基本概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;可以有自己的逻辑和外观&#xff0c;组件之间可以互相嵌套、复用多次。每个组件就是一个首字母大写的函数&#xff0c;内部存放了组件的逻辑和试图UI&#xff0c;渲染组件只需要把组件 当成 标签 书写。App 可以视…...