OS:Windows

Qt:6.8.1(6.x) 

Eg:学生信息管理系统

前言

        Qt Creator编写代码不是太方便,使用CLion编写代码或许是个不错的主意,CLion在此处主要是用于后端和测试的开发,界面方面还是需要使用Qt Creator开发效果更好。不过使用CLion开发前,需要满足以下条件:

下载相应版本的Qt Creator(6.x版本即可,为了方便使用QML,6.5比较好,因为这是当前ds知识库里的最新LTS版本),此处不赘述

所有安装或者项目路径均不能含有中文(除非全局编码是UTF-8)

安装Anaconda的需要注意一下,因为Anaconda里会有Qt库和一些构建套件等,这些会干扰系统环境变量,让Qt Creator和CLion等软件寻找的Qt库和构建器如Nija被夺舍,所以需要格外注意环境变量,防止报错时找不到原因

需要一定Qt开发基础,使用过Qt Creator开发一些Qt Widgets桌面应用

学生信息管理系统

一、创建项目 

1, 创建初始Qt项目

打开Qt Creator,点击【创建项目】,选择默认的桌面应用模板即可

名称和路径不能含有中文等特殊字符,构建系统选择CMake或者qmake(Qt6更推荐CMake)

        后面两个点击【下一步】,默认即可。构建套件默认使用的是llvm,这里凭个人习惯,此处为MinGW

版本控制系统这里不选择,使用CLion里的即可

创建完成后,程序可以正常编译运行

 2,CLion中打开项目

在资源管理器里找到创建的工程文件夹,使用CLion打开

使用CLion打开后,CLion会自动加载CMakeLists,一般情况下会显示无法找到Qt

        此时先到设置里配置工具链,新建一个MinGW型的工具链,然后指定工具集的路径,照着红框内的路径根据自身情况自行修改

        打开CMakeLists.txt文件,在find_package前添加下面这一句来指定CMake的搜索路径,确保CLion能正确找到Qt的路径,需注意这个路径的位置,是在Qt6.8.1里的6.8.1,而非是Qt6.8.1里的Tools目录

# 避免CLion识别错Qt的路径
set(CMAKE_PREFIX_PATH "E:/Tools/Develop/Embedded/Qt6.8.1/6.8.1/mingw_64")

重新CMake就不会报错了,并且可以正常编译(还不能运行)

无法运行是因为缺少一些dll,在程序运行配置里指定Qt里的bin目录即可(添加环境变量)

E:/Tools/Develop/Embedded/Qt6.8.1/6.8.1/mingw_64/bin

然后就能正常运行了

3,启用版本控制系统(可选)

需要具备一定的git使用基础

①本地仓库

在工具栏里找到VCS,选择启用版本控制集成

默认git,选择完成后,可以看到左边的提交

为了避免把一些无关文件添加到git仓库里,需要新建一个.gitignore文件,新建后弹出窗口,勾选【不再询问】并点击【添加】

在.gitignore里输入下面语句,把无关文件排除掉

# 首先排除CLion自身产生的工程配置文件
/.idea/
# 然后排除Qt Creator构建时产生的中间文件
build/
# 再然后排除CLion构建时产生的中间文件,使用通配符“*”是为了适应不同工具链不同编译选项
cmake-build-*/
# 最后是自定义排除文件或者文件夹

然后上面就会弹出一行提示,选择【查看目录】并点击【排除】

此时再回到提交里,可以看到提交里只有6个必要的文件

全部勾选后,并附上提交信息,即可进行提交

在下面可以看到刚才的提交

至于合并、提交等操作可以自行摸索尝试,此处不赘述了

②远程仓库

        打开自己的gitcode网站,输入项目名称,最后点击创建项目。由于是个人小项目,每次使用github推送都要挂梯子,很麻烦,此处用的是gitcode。

此时仓库里是空空如也的,把这个URL复制一下

到CLion里,右键当前分支,点击推送

点击定义远程

把刚才的URL粘贴进去(名称可以改为gitcode)

点击推送,这个过程可能会弹出输入账号密码的过程,密码需要输入访问令牌,此处不赘述

推送成功后,CLion右下方会有提示,并且gitcode网站刷新一下也能看到

想要邀请别人开发,可以在项目设置里,发出邀请链接或者直接邀请别人

③拉取请求

创建仓库时,会有一下角色和权限,创建者亦是管理者

        小队伍开发时,可以这样分配:一个master分支,其余为feature分支。这里的feature不是指单个分支,而是feature/xxx分支,在创建时可以如下输入,这表明这条分支是负责ui方面的

创建后如下

        master分支一般可由管理员或者维护者来维护,而feature分支则由其他开发人员开发。当feature分支(我指的是feature里的某单一分支)完成到了某一阶段(比如某些功能实现了),那么就可以创建拉取请求了,也就是想要把当前对master做的更改合并到master分支上。同时需要注意,feature分支的提交可以很频繁的,也就是修改了一些代码(比如十几行)就可以提交一下

        由于CLion里我没找到对gitcode的pull request的功能(目前只看到了github的pull request功能),所以需要到gitcode网站上创建拉取求(项目名更换了,不用在意

显然,源分支就是feature分支,需要合并到目标分支master分支

点击下一步后,可以进入更详细的界面,由于我这里还没有其他开发人员,所以合并人等实际上只有我自己

        PR(pull request的简称)标题要见名知义,PR描述可以详细一些(这里水一下),如果这个PR还没完成、还在修改中,不希望别人现在就合并它,就在标题前加上 [WIP]

前置PR容易造成PR依赖死锁,需要慎用

下面三个复选框:

①如果你的PR是为了解决某个特定Issue(任务/问题单),​​勾选这项​​会在PR合并后​​自动关闭​​那个Issue

②合并PR后,​​自动删除​​你创建的这个feature/...分支(在远程仓库),如果这个feature没做完就不要勾选

③ ​将你在feature分支上的所有小commit(提交)合并成一个大的新commit,再合并到主分支(main),这样可以避免master分支上会有很多琐碎的提交

        现在分析一下我们的情况,由于我们这次只是阶段性提交,feature/ui并没有完全开发完,那么就需要在PR标题前加上[WIP]。同时为避免琐碎提交,那么这个Squash我们就需要勾选上,并且输入Squash信息

往下滑可以看到以前的提交

此外,我们再考虑右边的人员设置:

审查人员:即代码审查者,提前检查代码质量​,如逻辑错误、代码规范、安全隐患等),可以不设置(自审)

合并人:即有权限合并这条PR的人,这个合并操作一般为【解决冲突 → 点击合并按钮 → 删除分支】,由于现在是单人项目,所以就分配给自己

测试人员:即验证功能是否正常的测试人员​​(适合需要 QA 介入的项目)。

评审人:在大型项目中用于​架构师或产品经理的最终业务评审​(如确认是否符合需求文档),注意ta不是代码审查者,与技术无关

Label:用来分类管理 PR​​,如标记模块(前端/后端)、类型(功能/Bug)、优先级(/

里程碑:​关联项目计划节点​​(如 v1.2 版本2024-Q2 迭代),用于追踪进度的

关联Issue:顾名思义,绑定此 PR 解决的具体任务或 Bug​​

这里先看看Label(进入后,前面的信息都会重置)

这里根据需要可以创建一个UI标签(实际上应该是前端和UI设计,但这里就我一个人),那就紫色吧

那么现在就可以创建了

此时Pull Requests里可以看到前面刚刚创建的PR

进去后可以看到这样的界面

先点个赞,下面的评论就先不评了,然后准备就绪开始合并

由于现在是相当于单分支开发,所以没有冲突要解决,那么就可以直接合并了

        回到CLion里,点击左边的【提及远程】,可以看到刚才的压缩合并过程

        多人开发的话,如果你在开发feature分支时,master分支更新了,那么就需要保存本地未提交的更改,拉取最新的master分支,然后合并到feature分支,这样可以让PR过程中的合并分支过程中冲突少一些,避免冲突积累过多

        只不过这个过程容易扭成麻花

二、项目组织

1, 结构

        接下来将以学生信息管理系统为例(不是成绩管理系统哦),为了更合理地开发,需要对原项目进行划分

## 学生信息管理系统### 基本要求:定义学生(student)类,其中至少包括姓名、性别、学号、学院、系、班级、宿舍、籍贯和联系电话。### 功能要求:1、设计菜单实现功能选择;   2、输入功能:输入学生信息,并保存到文件中;3、能按照学生的不同信息排序整理,如按学号、学院、宿舍等;4、能根据学号修改学生信息;5、能根据学号删除学生信息;6、查询功能:1)能够根据学号查询学生信息;2)能够根据姓名、学号、学院、系、班级、宿舍等分项信息查询学生记录;3)按照学院、系或者班级统计学生人数、统计各籍贯地学生的情况。7、所有的增加、修改、删除能同步到文件;也从文件读取数据到程序。

项目可以划分为这四个模块

        如果是团体分工的话,需要根据自身队伍具体能力情况进行划分,比如一个人负责核心和UI(强)、两个人负责服务功能(中),一个人负责测试和文档(弱)

那么项目结构可以这样组织

StudentInfoSystem/
├── docs/                    # 文档相关
│   └── 设计文档.md          # 系统设计文档
├── src/                     # 源代码
│   ├── core/                # 核心数据模型
│   │   ├── student.h        # 学生类定义
│   │   └── student.cpp
│   ├── data/                # 数据持久层
│   │   ├── datastorage.h    # 数据存储接口
│   │   └── filestorage.cpp  # 文件存储实现
│   ├── services/            # 业务逻辑层
│   │   ├── studentservice.h
│   │   └── studentservice.cpp
│   ├── ui/                  # UI界面层
│   │   ├── widgets/         # 自定义控件
│   │   │   └── studenttablewidget.h
│   │   ├── dialogs/         # 对话框
│   │   │   ├── addstudentdialog.h
│   │   │   └── editstudentdialog.h
│   │   └── mainwindow/      # 主窗口
│   │       ├── mainwindow.h
│   │       └── mainwindow.cpp
│   └── utils/               # 工具类
│       └── fileutil.h       # 文件操作工具
├── resources/               # 资源文件
│   ├── icons/               # 图标资源
│   │   └── app_icon.png
│   ├── styles/              # QSS样式表
│   │   └── style.qss
│   └── translations/        # 翻译文件
│       └── studentinfo_zh_CN.qm
├── data/                    # 数据存储目录
│   └── students.dat         # 学生数据文件
└── tests/                   # 单元测试└── test_studentservice.cpp

 2,CMakeLists

        决定好项目结构后,就可以修改CMakeLists来同步构建系统

        在CMakeLists里,需要包含头文件目录,重新指定源文件(在Qt里,头文件也算资源文件)。使用Qt6.x,主要是想使用QML,因此,还需要包含qml.qrc文件(直接当成普通源文件包含即可,使用qt_add_resources可能会有问题)

# ================================== 资源文件 =====================================
# -------------- qml文件 ----------------
file(GLOB_RECURSE QML_SRCS "qml.qrc")# -------------- cpp文件 ----------------
# Core层
file(GLOB_RECURSE CORE_SRCS"src/core/*.*")# Services层
file(GLOB_RECURSE SERVICES_SRCS"src/services/*.*")# ---------- 所有资源文件 ----------
include_directories(src)set(PROJECT_SOURCES${CORE_SRCS}${SERVICES_SRCS}${QML_SRCS}
)

重新CMake并编译运行,一切正常(路径不要搞错)。回到Qt Creator里,也是如此

三、开发桌面应用

        需要一定Qt开发基础

1、选择UI开发体系

         Qt里的UI体系无非​​Qt WidgetsQt Quick / QMLQt Design Studio,在6.x中主推的是Qt Quick / QML,也是此处示例所用。它是声明式UI,纯编写代码,非常适合当前大语言模型发展不错的情况,因为很多情况下可以在几分钟之内使用DeepSeek等生成较为美观的UI界面或者组件样式

        这种UI开发体系下,需要在根目录创建一个qml.qrc文件,用以囊括所有的qml文件(qml文件相当于​Qt Widgets下的ui文件),在构建时只需要包含qml.qrc即可,不需要包含qml文件,因为这些qml文件会在构建时自动解析qml.qrc而包含,所以包含的资源文件一定是当前工程里存在的,不存在会报错。

        qrc文件内容如下:

<!DOCTYPE RCC>
<RCC version="1.0"><qresource prefix="/"><!-- 主QML文件 --><file>src/ui/mainWindow.qml</file><!-- 组件 --><file>src/ui/components/studentTable.qml</file>
<!--        <file>src/ui/components/SearchBar.qml</file>-->
<!--        <file>src/ui/components/SortComboBox.qml</file>--><!-- 对话框 -->
<!--        <file>src/ui/dialogs/AddStudentDialog.qml</file>-->
<!--        <file>src/ui/dialogs/EditStudentDialog.qml</file>-->
<!--        <file>src/ui/dialogs/StatsDialog.qml</file>--><!-- 样式表 -->
<!--        <file alias="styles/main.qss">resources/styles/main.qss</file>--><!-- 图标资源 -->
<!--        <file alias="icons/add.png">resources/icons/add.png</file>--><!-- 字体文件(可选) -->
<!--        <file alias="fonts/Roboto-Regular.ttf">resources/fonts/Roboto-Regular.ttf</file>--></qresource>
</RCC>

2、提示词

        与DeepSeek等交流时(后面单称ds,以代替所有大语言模型),那么应是从宏观到微观,因为ds的上下文有限,并且这一轮对话可能会“污染”前几轮对话,让其误解或者沿着某种惯性思路。为此,难免要新开对话,可以创建一个简单的提示词本,保存模板提示词,根据具体情况不断迭代提示词。

        现在以前面那个项目为例,开发一个桌面应用。

①项目结构

        那么需要新开一个对话,问其项目结构如何划分

我需要开发一个Windows下的Qt桌面应用(构建系统是cmake,Qt版本是Qt6.8.1),我已经创建了什么样的的项目结构?学生信息管理系统
基本要求:定义学生(student)类,其中至少包括姓名、性别、学号、学院、系、班级、宿舍、籍贯和联系电话。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、能按照学生的不同信息排序整理,如按学号、学院、宿舍等;
4、能根据学号修改学生信息;
5、能根据学号删除学生信息;
6、查询功能:1)能够根据学号查询学生信息;2)能够根据姓名、学号、学院、系、班级、宿舍等分项信息查询学生记录;3)按照学院、系或者班级统计学生人数、统计各籍贯地学生的情况。
7、所有的增加、修改、删除能同步到文件;也从文件读取数据到程序。

        然后可以接着这个对话,问一些更细节的或者不解的地方,比如

为什么要创建xxx目录,而不是把xxx目录与xxx目录合并起来呢?我们是4个人分工,那么这个项目结构可不可以按照功能划分更适配我们分工的目录?我们四个人分别擅长xxx,…………

        最终,可以获得一个符合要求的基本项目结构,如下。当然,这并非一成不变的,开发过程中,可以根据具体情况来微调

StudentInfoSystem/
├── docs/                    # 文档相关
│   └── 设计文档.md          # 系统设计文档
├── src/                     # 源代码
│   ├── core/                # 核心数据模型
│   │   ├── main.cpp
│   │   ├── student.h        # 学生类定义
│   │   └── student.cpp
│   ├── data/                # 数据持久层
│   │   ├── dataStorage.h    # 数据存储接口
│   │   └── fileStorage.cpp  # 文件存储实现
│   ├── services/            # 业务逻辑层
│   │   ├── studentService.h
│   │   └── studentService.cpp
│   ├── ui/                  # UI界面层
│   │   ├── components/
│   │   ├── widgets/         # 自定义控件
│   │   ├── dialogs/         # 对话框
│   │   └── mainWindow.qml      # 主窗口
│   └── utils/               # 工具类
│       └── fileutil.h       # 文件操作工具
├── qml.qrc
├── resources/               # 资源文件
│   ├── icons/               # 图标资源
│   ├── styles/              # QML样式表
│   └── translations/        # 翻译文件
├── data/                    # 数据存储目录
│   └── students.dat         # 学生数据文件
└── tests/                   # 单元测试└── test_studentservice.cpp

②基础架构

        前面提过,ds上下文有限等,需要单独开一个新对话,那么我们可以根据前面获取到的信息,来重新组织提示词。此时,我们需要一个基础架构,也就是不同目录该放哪些文件,这些文件里该写哪些代码。实际上,是把各模块的分工实现先定个“基调”,这样开启新对话时,可以专门针对这个模块,进行更详细的探讨。

我需要开发一个Windows下的Qt桌面应用(构建系统是cmake,Qt版本是Qt6.8.1),我已经创建了如下的项目结构:
StudentInfoSystem/
├── docs/                    # 文档相关
│   └── 设计文档.md          # 系统设计文档
├── src/                     # 源代码
│   ├── core/                # 核心数据模型
│   │   ├── main.cpp
│   │   ├── student.h        # 学生类定义
│   │   └── student.cpp
│   ├── data/                # 数据持久层
│   │   ├── dataStorage.h    # 数据存储接口
│   │   └── fileStorage.cpp  # 文件存储实现
│   ├── services/            # 业务逻辑层
│   │   ├── studentService.h
│   │   └── studentService.cpp
│   ├── ui/                  # UI界面层
│   │   ├── components/
│   │   ├── widgets/         # 自定义控件
│   │   ├── dialogs/         # 对话框
│   │   └── mainWindow.qml      # 主窗口
│   └── utils/               # 工具类
│       └── fileutil.h       # 文件操作工具
├── qml.qrc
├── resources/               # 资源文件
│   ├── icons/               # 图标资源
│   ├── styles/              # QML样式表
│   └── translations/        # 翻译文件
├── data/                    # 数据存储目录
│   └── students.dat         # 学生数据文件
└── tests/                   # 单元测试└── test_studentservice.cpp
除了main.cpp外,其他文件都是空白的(因为是新建项目)。我打算使用QML开发
现在只需要搭建一个方便扩展的框架,不考虑实际实现,那么根据下面项目要求,我该创建哪些文件、修改或者编写哪些代码?
学生信息管理系统
基本要求:定义学生(student)类,其中至少包括姓名、性别、学号、学院、系、班级、宿舍、籍贯和联系电话。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、能按照学生的不同信息排序整理,如按学号、学院、宿舍等;
4、能根据学号修改学生信息;
5、能根据学号删除学生信息;
6、查询功能:1)能够根据学号查询学生信息;2)能够根据姓名、学号、学院、系、班级、宿舍等分项信息查询学生记录;3)按照学院、系或者班级统计学生人数、统计各籍贯地学生的情况。
7、所有的增加、修改、删除能同步到文件;也从文件读取数据到程序。

        接下来就是在这个对话里,不断问询,知道没有什么太大的疑问为止,此过程不再赘述。

③单一模块实现

        在知道了个模块如何分工,那么接下来就可以专注于单一模块的实现,尽情提要求,这里以UI为例

我需要开发一个Windows下的Qt桌面应用(构建系统是cmake,Qt版本是Qt6.8.1),使用的是QML
学生信息管理系统
基本要求:定义学生(student)类,其中至少包括姓名、性别、学号、学院、系、班级、宿舍、籍贯和联系电话。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、能按照学生的不同信息排序整理,如按学号、学院、宿舍等;
4、能根据学号修改学生信息;
5、能根据学号删除学生信息;
6、查询功能:1)能够根据学号查询学生信息;2)能够根据姓名、学号、学院、系、班级、宿舍等分项信息查询学生记录;3)按照学院、系或者班级统计学生人数、统计各籍贯地学生的情况。
7、所有的增加、修改、删除能同步到文件;也从文件读取数据到程序。
此时我已经拥有了如下目录:
├── src/                     # 源代码
│   ├── core/                # 核心数据模型
│   │   ├── main.cpp
│   │   ├── student.h        # 学生类定义
│   │   └── student.cpp
│   ├── data/                # 数据持久层
│   │   ├── dataStorage.h    # 数据存储接口
│   │   └── fileStorage.cpp  # 文件存储实现
│   ├── services/            # 业务逻辑层
│   │   ├── studentService.h
│   │   └── studentService.cpp
│   ├── ui/                  # UI界面层
│   │   ├── components/
│   │   ├── widgets/         # 自定义控件
│   │   ├── dialogs/         # 对话框
│   │   └── mainWindow.qml      # 主窗口
│   └── utils/               # 工具类
│       └── fileutil.h       # 文件操作工具
这是我的main函数
int main(int argc, char *argv[]) {QGuiApplication app(argc, argv);// 初始化数据存储auto *storage = new FileStorage("data/students.dat");// 初始化学生服务StudentService studentService(storage);// 设置 QML 样式QQuickStyle::setStyle("Fusion"); // 或 "Material", "Universal" 等qputenv("QML_STYLE", "Fusion");  // 与 QSS 兼容QQmlApplicationEngine engine;// 将服务暴露给QMLengine.rootContext()->setContextProperty("StudentService", &studentService);// 加载主界面engine.load(QUrl(QStringLiteral("qrc:/src/ui/mainWindow.qml")));return QGuiApplication::exec();
}
接下来只考虑UI设计,我需要美观简洁的界面,那么需要在UI目录里创建哪些qml文件,编写哪些代码?

④……

        简单要求的项目,提示词三次迭代差不多了(当然不止三个新对话)。如果要更高的要求,那么可以继续迭代下去,甚至到某个函数的具体实现,就像一颗树一样,不断分叉。

        如果在询问过程中,有好的思路,把思路附上去,回答会更加精准,但显然会有局限。那么再次之前,可以让其给出不同思路,逐一比较选择最合适的,或再进行微调。

        如果是修改现有代码的话,那么可以把你需要修改的代码文件复制一份到桌面,把后缀名改为.txt(可以写一个bat脚本之类的),这样ds就能识别了

3,另一种思路

        界面开发的另一种思路,我们都知道界面开发这块还得看Web前端,而QML很接近Web前端里的声明式开发,那么我们可以先生成一些Web界面(使用Trae),选择合适的界面,再把相应的文件给ds,让它生成相应的QML

我需要开发Web前端界面,要足够美观,不需要具体功能
学生信息管理系统
基本要求:定义学生(student)类,其中至少包括姓名、性别、学号、学院、系、班级、宿舍、籍贯和联系电话。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、能按照学生的不同信息排序整理,如按学号、学院、宿舍等;
4、能根据学号修改学生信息;
5、能根据学号删除学生信息;
6、查询功能:
1)能够根据学号查询学生信息;
2)能够根据姓名、学号、学院、系、班级、宿舍等分项信息查询学生记录;
3)按照学院、系或者班级统计学生人数、统计各籍贯地学生的情况。
7、所有的增加、修改、删除能同步到文件;也从文件读取数据到程序。

3、常见错误

①卡死无响应

        需要注意,在CLion里运行程序时,有时程序会卡死,只能通过任务管理器关闭,这多半是因为QML文件有问题,需要在Qt Creator里去运行,Qt Creator会给出报错提示

②qml组件未找到

        在Qt Creator中出现这种警告“xxx was not found.……”,如果文件确实创建了并且qrc里也声明了,那么就是没有使用import导入,这里导入的是其目录而非某一文件

对于如下目录结构

ui/
├── components/
│   ├── NavigationMenu.qml       # 左侧导航菜单
│   ├── StudentForm.qml          # 学生信息表单组件
│   ├── StudentTable.qml         # 学生信息表格组件
│   └── SearchBar.qml            # 搜索组件
├── views/
│   ├── InputView.qml            # 学生信息录入视图
│   ├── ListView.qml             # 学生信息列表视图
│   ├── QueryView.qml            # 学生查询视图
│   └── StatsView.qml            # 统计视图
├── dialogs/
│   ├── ConfirmDialog.qml        # 确认对话框
│   └── EditDialog.qml           # 编辑对话框
└── mainWindow.qml               # 主窗口

在mainWindow.qml想要使用各个组件,那么需要在这般导入

// 导入各自目录下的QML组件
import "components"
import "dialogs"
import "views"

③ChartView导致程序进程崩溃

        相当坑爹的错误,没有之一,不过网上有解决办法。总之,QML或者说Qt6推荐使用新的QGuiApplication,但使用QML中的ChartView时必须使用旧的QApplication(Widgets用的),否则一创建ChartView,程序就会立刻!立即!崩溃!

        有些东西,不上网搜一下都不会发现这么离谱

3,效果示例

        经过前面所说的三次提示词简单迭代后,就已经可以得到一个基础的界面

        经过多轮迭代(一轮并非一个对话),主要是样式和布局的调整,可以得到还行的界面。不过想要达到更高级更炫酷的界面,仅通过简单的提示词和思路有些困难,需要对QML和UI设计有更深的了解

        磨砂、半透明、渐变的、高级现代感的,暂时还没试出来,不打算继续往后做了

gitcode:项目首页 - StudentInfoSystem - GitCode

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

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

相关文章

C语言专题:8.函数指针(Function Pointer)

​ 在 C 语言中&#xff0c;函数也是一种“对象”&#xff0c;它在内存中有地址。因此可以定义指向函数的指针&#xff0c;用于动态调用、回调处理、构建函数表等。 掌握函数指针是理解 C 语言“底层抽象”与“模块化编程”的关键。 一、函数指针的基本概念 ​ 函数指针是一个变…

快速傅里叶变换(FFT)是什么?

快速傅里叶变换(FFT)是什么&#xff1f; 快速傅里叶变换&#xff08;FFT&#xff09; 本质上是一种极其高效的算法&#xff0c;用来计算**离散傅里叶变换&#xff08;DFT&#xff09;**及其逆变换。它是数字信号处理、科学计算和工程应用中最重要的算法之一。 要理解 FFT&…

EEG分类 - Theta 频带 power

在EEG&#xff08;脑电图&#xff09;信号处理的背景下&#xff0c;theta波段功率&#xff08;Theta Band Power&#xff09;是一个重要的特征&#xff0c;广泛应用于认知、神经科学和临床监测等领域。接下来&#xff0c;我将详细介绍theta波段功率的定义、特性、计算方法以及在…

苍穹外卖day3--公共字段填充+新增菜品

1.公共字段填充 1.1 问题分析 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在我们的系统中很多表中都会有这些字段…

每次选择都是成本

概述 我们每个人都在做选择&#xff0c;而且无时无刻不在做选择。 有的人有的选&#xff0c;而有的人却没得选。 因此从侧面来说&#xff0c;有的选反而更是一种幸福。 我们学习的目的就是为了让我们自己在未来能有更好地选择&#xff0c;也可以底气十足地选择不去做什么&a…

AI in CSR Writing: Revolutionizing Clinical Trial Reports

一、AI在CSR撰写中的实际应用 1.1 自动化数据整合与报告生成 1.1.1 数据提取与汇总 AI自动从EDC、实验室系统、安全数据库提取数据,生成统计图表和表格,如人口统计学、疗效终点、安全性事件表,减少人工操作。 1.1.2 动态报告生成 基于预设模板,AI自动填充数据结果,如自动…

《Java反射到底该不该用?性能、灵活性与可维护性三者博弈》

大家好呀&#xff01;今天我们要聊一个Java中超级强大但也需要谨慎使用的特性——反射机制(Reflection) &#x1f3ad;。我会用最通俗易懂的方式&#xff0c;带大家彻底搞懂这个"程序界的魔术师"&#xff01; 一、什么是Java反射&#xff1f;&#x1f914; 想象一下…

从Java API调用者到架构思考:我的Elasticsearch认知升级之路

前言&#xff1a;我的Elasticsearch学习历程 作为一名Java开发者&#xff0c;记得第一次使用ES的Java High Level REST Client时&#xff0c;我被它强大的搜索能力所震撼&#xff0c;但也为复杂的集群调优所困扰。经过多个项目的实战积累和系统性学习&#xff0c;我终于建立了对…

高云GW5AT-LV60 FPGA图像处理板

GW5AT-LV60开发板体积小巧&#xff0c;长100mm宽为61.8mm&#xff0c;还没有一部Ipone SE2体积大&#xff0c;该板卡采用了核心板和载板分离的形式&#xff0c;核心板的形式可方便开发者在项目中根据实际需求来开发自己的载板&#xff0c;只需要为核心板提供5V的电源就能满足基…

[XILINX]ZYNQ7010_7020_软件LVDS设计

若该文为原创文章&#xff0c;未经允许不得转载风释雪QQ:627833006WX:Cheng18375816918CSDN博客: 风释雪FPGA知乎&#xff1a;风释雪FPGA 1.版本说明 日期作者版本说明2024xxxx风释雪初始版本 2.概述 ZYNQ 7010/7020 HR/HP Bank LVDS Rx/TX&#xff1b; 3.目标 ZYNQ 7010 LVD…

桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏

飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上占用…

SpringCloud Gateway 组件的使用

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 我发现了一个很有意思的缩写单词 gw、wg&#xff0c;都是网关的意思。因为 gw gateway、wg wangguan&#xff0c;所以在各个系统开发中&#xff0c;既有 gw 也有 wg 的存在。而网关…

随机地址生成器 - Cloudflare Workers

分享一个完全开源免费部署在 Cloudflare Workers 上的随机地址生成器&#xff0c;支持全球 24 个国家/地区。 &#x1f517; 工具地址: https://address.chat-tempmail.com ✨ 特性 &#x1f30d; 支持生成 24 个国家/地区的地址&#x1f4f1; 响应式设计&#xff0c;完美支持…

CNN不是一个模型?

CNN不是一个模型&#xff1f; 结论&#xff1a; CNN 是模型架构而非具体模型&#xff0c;其定位类似深度学习领域的 「设计框架」&#xff0c;而非 LSTM&#xff08;具体单元结构&#xff09;或决策树&#xff08;具体算法实体&#xff09;。CNN 的 「具体模型」 需要结合网络…

爱基百客与真迈生物达成战略合作,共推多组学科研服务升级

近日&#xff0c;武汉爱基百客生物科技有限公司&#xff08;以下简称“爱基百客”&#xff09;与真迈生物正式签署战略合作协议。此次战略合作将聚焦表观组学、单细胞时空组学等前沿科研领域&#xff0c;联合打造基于自主创新技术的多组学科研服务方案&#xff0c;为科研人员提…

吴恩达:从斯坦福到 Coursera,他的深度学习布道之路

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 吴恩达&#xff1a;从斯坦福到 Coursera&#xff0c;他的深度学习布道之路 在人工智能…

开疆智能CCLinkIE转ModbusTCP网关连接测联无纸记录仪配置案例

本案例是通过CCLinkIE转ModbusTCP网关将记录仪数据传送到三菱PLC&#xff0c;具体操作过程如下。 &#xff08;1&#xff09; 无纸记录仪与PT100传感器连接正确后&#xff0c;将无纸记录仪和PC通过网线连接&#xff0c;给无纸记录仪上电&#xff0c;设置无纸记录仪的IP地址及网…

【软考高级系统架构论文】# 论软件设计方法及其应用

论文真题 软件设计 (Software Design,SD) 根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

Spring Boot 3.x 项目搭建 (一)

以下是一个基础 Spring Boot 项目的创建指南&#xff0c;整合了官方推荐方式和实用配置&#xff0c;帮助您快速搭建可运行的项目骨架。 &#x1f31f; 一、项目创建方式 1. 在线工具 Spring Initializr&#xff08;推荐&#xff09; 步骤&#xff1a; 访问 Spring Initializr…

《天行数据查询系统项目介绍》

一、项目概述 天行数据查询系统是一款功能丰富的 Android 应用程序&#xff0c;旨在为用户提供便捷的信息查询服务。该系统集成了多个实用的查询功能&#xff0c;包括空气质量查询、天气预报查询、垃圾分类查询、新闻资讯浏览以及身份证信息查询等&#xff0c;方便用户一站式获…