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

news2025/3/5 7:56:48

前言:

我的想法是搭建一个和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_OBJECT

public:
    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.coloradmin.cn/o/2309907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设置 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;开发者能够实现应用的快速部署、弹性伸缩和故障自愈…

机器学习(五)

一&#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…

电商主图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 反射模…

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

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

第四十一: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 可以视…

环境变量 ─── linux第14课

本内容为总结: 1. 环境变量本质是配置信息, 在系统配置时起效 . 2. 环境变量具有全局性(子进程可以继承父进程的环境信息,不能继承本地变量) 3. 进程具有独立性 ,环境变量可以进程间传递信息(只读信息) 环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操…