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);}
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27375.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统:计算机架构里的幕后指挥官

Linxu系列 文章目录 Linxu系列前言一、操作系统的概念二、操作系统的工作原理三、操作系统对软硬件资源的管理总结 前言 在上篇博客中&#xff0c;我们介绍了冯诺依曼体系&#xff0c;&#xff0c;但是冯诺依曼体系结构出现的都是硬件设备&#xff0c;难道需要用户去操作、管理…

DNS 详细过程 与 ICMP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; DNS (Domain Name System) 快速了解&#x1f98b; DNS 背景&#x1f98b; 域名简介&#x1f98b; 真实地址查询 —— DNS&#x1f380; 域名的层级关系&am…

【C/C++算法】从浅到深学习--- 位操作算法(图文兼备 + 源码详解)

绪论&#xff1a;冲击蓝桥杯一起加油&#xff01;&#xff01; 每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 今天总结了下位操作中常见的使用的方法&#xff0c;并且附加许多训练&#xff0c;通过…

【每日八股】计算机网络篇(二):TCP 和 UDP

目录 TCP 的头部结构&#xff1f;TCP 如何保证可靠传输&#xff1f;1. 确认应答机制2. 超时重传3. 数据排序与去重4. 流量控制5. 拥塞控制6. 校验和 TCP 的三次握手&#xff1f;第一次握手第二次握手第三次握手 TCP 为什么要三次握手&#xff1f;问题一&#xff1a;防止历史连接…

Tomcat-web服务器介绍以及安装部署

一、Tomcat简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用…

【通俗讲解电子电路】——从零开始理解生活中的电路(三)

实际应用案例&#xff1a;生活中的电子电路 ——拆解你身边的“隐形工程师” 1. 手电筒电路&#xff1a;最简单的直流系统 电路组成 电源&#xff1a;2节1.5V电池&#xff08;串联3V&#xff09;。 开关&#xff1a;按钮控制回路通断。 LED&#xff1a;发光二极管&#xff…

部署Windows Server自带“工作文件夹”实现企业网盘功能完整步骤

前文已经讲解过Windows Server自带的“工作文件夹”功能&#xff0c;现以Windows Server 2025为例介绍部署工作文件夹的完整步骤&#xff1a; 为了确保您能够顺利部署和充分利用工作文件夹的功能&#xff0c;我将按照以下步骤进行讲解。 请注意&#xff0c;在域环境中部署工作…

详解LSM树

目录 什么是LSM树 磁盘结构与顺序IO LSM树结构 LSM树的写入 SSTable合并 LSM树的读取 LSM树的删除 总结 什么是LSM树 LSM 树全名日志结构合并树&#xff08;Log-Structured Merge Tree&#xff09;&#xff0c;是一种用于存储和管理数据的树状数据结构&#xff0c;常用…

ABAP语言的动态编程(3) - data reference 对象

如果数据对象的类型在运行时才知道&#xff0c;就需要用到 data reference 对象。 Data references can point to any data objects or to their parts (components, rows of internal tables, or sections specified by offsets and lengths) 也就是说 data reference 对象其实…

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准&#xff0c;方便小学生书法和练字。Word&#xff0c;Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时&#xff0c;如果没有专用模板、奇奇怪怪的插件&#xff0c;使用起来会碰到各种问题。比如&#xff0c;Word里面用…

Stepdown SLOPE for Controlled Feature Selection

文章&#xff1a;《Stepdown SLOPE for Controlled Feature Selection》 如何保证错选率可控地特征选择&#xff1f;&#xff1f;&#xff1f;&#xff1f; 研究背景 现有SLOPE方法主要关注FDR&#xff08;错误发现率&#xff09;控制&#xff0c;但在实际应用中需更严格地控…

mysql空间占用

1、查询数据库占用空间 可以通过查询 information_schema 系统数据库中的 SCHEMATA 表和 TABLES 表来获取数据库占用的空间大小。 SELECT table_schema AS 数据库名称,SUM(data_length index_length) / 1024 / 1024 AS 占用空间(MB) FROM information_schema.TABLES GROUP BY…

量子关联特性的多维度探索:五量子比特星型系统与两量子比特系统的对比分析

模拟一个五量子比特系统&#xff0c;其中四个量子比特&#xff08;编号为1, 2, 3, 4&#xff09;分别与第五个量子比特&#xff08;编号为5&#xff09;耦合&#xff0c;形成一个星型结构。分析量子比特1和2的纠缠熵随时间的变化。 系统的哈密顿量H描述了量子比特间的相互作用…

嵌入式学习笔记-卡尔曼滤波,PID,MicroPython

文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型&#xff08;预测系统状态&#xff09;2. 观测模型&#xff08;预测测量值&#xff09; 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…

计算机网络学习————(五)TCP/IP学习

前文学习&#xff1a; 一、二、三、四 学习来源网站 &#xff1a; 极客时间 TCP协议 发展历史 ARPA-NCP协议————可扩展性差、且对应的一般为单对单 解决问题&#xff1a; 在IP协议之上&#xff0c;解决网络通讯可依赖问题 点对点&#xff0c;面向连接 双向传递 字节流&am…

智能笔记,智慧管理:Obsidian 与 DeepSeek 携手引领 AI 知识新时代

清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 AI 助力下的知识管理革新&#xff1a;构建你的智能 Obsidian 系统 在数字时代&#xff0c;如何高效地整…

VSCode 移除EmmyLua插件的红色波浪线提示

VSCode 中安装插件EmmyLua&#xff0c;然后打开lua文件的时候&#xff0c;如果lua代码引用了C#脚本的变量&#xff0c;经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示&#xff0c;这个提示看着比较烦人&#xff0c;我们可以通…

优得运维推出光伏电站运维精进班,助力新能源行业人才培养

随着全球新能源产业的快速发展&#xff0c;光伏电站的运维需求日益增长。为了满足行业对高素质运维人才的需求&#xff0c;优得运维——联盛新能源集团的核心成员&#xff0c;正式推出光伏电站运维精进班。该课程旨在通过系统化的培训&#xff0c;帮助学员夯实电工基础、提升应…

anything文本分割优化

1、文本分割优化&#xff0c;建议 200 和40&#xff0c;把文档切得更碎一些方便检索命中。 2、RAG接口进一步优化 /*** RAG知识库接口** param prompt* return*/GetMapping(value "/rag/chat", produces MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatCom…

全志A133 android10 mipi屏幕调试

一&#xff0c;确认屏幕信息 屏幕调试首先要查看屏幕规格书&#xff0c;主要看里面的屏供电电压vdd&#xff0c;背光供电电压&#xff0c;timing参数部分。 举个例子&#xff1a; 屏供电电压 可以看出供电电压为3.3V&#xff0c;过大则会烧屏&#xff1b;背光供电电压 屏幕…