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

CLion开发Qt桌面程序_git的简单使用_小团体

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

相关文章:

  • (LeetCode 面试经典 150 题) 80. 删除有序数组中的重复项 II (双指针、栈)
  • 信贷域——信贷年审业务
  • Python漂浮的爱心
  • 闲庭信步使用SV搭建图像测试平台:第五课——使用task
  • 【Fargo】mediasoup发送2:码率分配、传输基类设计及WebRtcTransport原理
  • x1+x2=4 X1-X2=2的画图呢?
  • std::shared_ptr 的线程安全性
  • Java基础 6.21
  • cursor中定义cursor rules
  • 【Elasticsearch】运维监控:分片和节点
  • 当数据自己会说话:聚类与分类算法全景解析
  • P1220 关路灯
  • AI大模型学习之基础数学:微积分-AI大模型的数学引擎
  • nn4dms开源程序是用于深度突变扫描数据的神经网络
  • 安装 Labelme
  • 如何使用Ant Design Blazor组件在列表页弹窗增加修改数据
  • C++ 文件读写
  • 并查集(Disjoint-Set Union)详解
  • 单点登录(SSO)系统
  • SpringAI1.0.0 入门案例
  • wordpress自定义文章链接/四川seo排名
  • 自己做的网站加载慢的原因/关键词排名优化系统
  • 深圳最好用的网站设计/seo标题关键词优化
  • 独立购物网站建设/网络seo优化
  • 怎样做的英文网站/查排名的网站
  • 展示型网站制作/营销的手段和方法