【QT实战の心情笔记】
文章目录
- 界面布局
- 主要界面分为三部分:
- 1. 笔记列表区域
- 2. 笔记内容编辑区域
- 3. 操作按钮区域
- Qt Designer 界面设计步骤
- 完整界面布局图
- 各控件设置和属性
- Qt Designer 文件 (.ui)
- 数据库表结构
- SQL 表结构:
- 逻辑代码
- 1. 项目结构
- 2. Note 类 (`Note.h` 和 `Note.cpp`)
- `Note.h`
- `Note.cpp`
- 3. DatabaseManager 类 (`DatabaseManager.h` 和 `DatabaseManager.cpp`)
- `DatabaseManager.h`
- `DatabaseManager.cpp`
- 4. MainWindow 类 (`MainWindow.ui`, `MainWindow.cpp` 和 `MainWindow.h`)
- `MainWindow.ui`
- `MainWindow.cpp`
- `MainWindow.h`
- 5. 总结
此程序使用 Qt Widgets 和 SQLite 来实现,并展示了笔记的标题、内容以及修改时间。
为了帮助你理解如何设计这个个人笔记应用的界面,下面我将详细描述界面布局以及各个控件的功能。由于我无法直接生成图像,我会尽量通过文字和布局描述来帮助你在 Qt Designer 中实现界面。
界面布局
主要界面分为三部分:
- 笔记列表区域(显示所有笔记的标题和修改时间)
- 笔记内容编辑区域(编辑选中的笔记的内容)
- 操作按钮区域(添加、删除、保存等按钮)
1. 笔记列表区域
- 使用 QListView 来显示笔记的标题和修改时间。
- 每个笔记的显示格式为:
- 标题(一行文字)
- 修改时间(时间戳,格式为
yyyy-MM-dd HH:mm:ss
)
QListView 上需要显示的内容是:
Title 1
2024-12-18 15:30:00Title 2
2024-12-17 14:20:00
2. 笔记内容编辑区域
- 使用 QTextEdit 来显示和编辑选中的笔记的详细内容。
- 用户可以在这里修改笔记内容,当保存时内容会更新到数据库。
3. 操作按钮区域
- 添加按钮:用户点击后可以创建一个新笔记。
- 删除按钮:用户点击后可以删除当前选中的笔记。
- 保存按钮:用户点击后保存当前编辑的笔记内容。
Qt Designer 界面设计步骤
在 Qt Designer 中,你可以按照以下步骤创建界面:
-
创建一个
QMainWindow
:- 选择
QMainWindow
作为主窗口类型。
- 选择
-
添加一个
QWidget
:- 将一个
QWidget
拖入QMainWindow
中,作为主界面的容器。
- 将一个
-
设置布局:
- 在
QWidget
中,设置一个QHBoxLayout
或QVBoxLayout
来组织控件。 - 推荐使用
QVBoxLayout
,将界面分成垂直区域。
- 在
-
添加
QListView
控件:- 在上方区域添加一个
QListView
控件,宽度设置为适当的大小来显示笔记的标题和修改时间。 - 设置
QListView
的大小策略,使其能够填充上方区域。
- 在上方区域添加一个
-
添加
QTextEdit
控件:- 在下方区域添加一个
QTextEdit
控件,用来显示和编辑笔记的内容。 - 设置其大小策略,使其填充剩余的空间。
- 在下方区域添加一个
-
添加操作按钮:
- 在界面底部,使用
QHBoxLayout
添加三个按钮:Add
按钮:用于创建新笔记。Delete
按钮:用于删除选中的笔记。Save
按钮:用于保存当前编辑的笔记。
- 在界面底部,使用
完整界面布局图
--------------------------------------
| 笔记列表区域 |
|------------------------------------|
| Title 1 2024-12-18 15:30:00 |
| Title 2 2024-12-17 14:20:00 |
| ... |
--------------------------------------
| 笔记内容编辑区域 |
|------------------------------------|
| [此处显示或编辑笔记内容] |
--------------------------------------
| [Add] [Delete] [Save] |
--------------------------------------
各控件设置和属性
-
QListView:
- 需要绑定一个 QStringListModel 或 QListView 模型来显示笔记的标题和修改时间。
- 在模型中,每个条目应当是 “标题 + 修改时间”。
-
QTextEdit:
- 设置
setPlainText()
或setHtml()
方法来显示笔记内容。 - 用户可以编辑其中的内容。
- 设置
-
按钮:
- 设置按钮的文本为
Add
、Delete
和Save
,并为这些按钮添加相应的信号与槽连接。
- 设置按钮的文本为
Qt Designer 文件 (.ui)
你可以按照以上描述在 Qt Designer 中创建界面,下面是一个简化版的 .ui 文件结构,你可以在 Qt Designer 中直接创建这个界面。
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><widget class="QWidget" name="centralwidget"><layout class="QVBoxLayout" name="verticalLayout"><widget class="QListView" name="noteListView"/><widget class="QTextEdit" name="noteTextEdit"/><layout class="QHBoxLayout" name="buttonLayout"><widget class="QPushButton" name="addButton"><property name="text"><string>Add</string></property></widget><widget class="QPushButton" name="deleteButton"><property name="text"><string>Delete</string></property></widget><widget class="QPushButton" name="saveButton"><property name="text"><string>Save</string></property></widget></layout></layout></widget><centralwidget/><statusbar/></widget>
</ui>
数据库表结构
首先,我们需要一个数据库表来存储笔记。创建数据库和表结构。
SQL 表结构:
CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT NOT NULL,content TEXT,modified_time TEXT
);
- id:笔记的唯一标识符。
- title:笔记的标题。
- content:笔记的内容。
- modified_time:笔记的修改时间(格式为
yyyy-MM-dd HH:mm:ss
)。
逻辑代码
1. 项目结构
该项目包含以下文件:
Note.h
和Note.cpp
:定义笔记类。DatabaseManager.h
和DatabaseManager.cpp
:管理数据库的类。MainWindow.ui
:Qt Designer 设计的主窗口界面。MainWindow.cpp
和MainWindow.h
:主窗口的实现和交互逻辑。
2. Note 类 (Note.h
和 Note.cpp
)
Note
类用于表示单个笔记,包含标题、内容和修改时间等信息。
Note.h
#ifndef NOTE_H
#define NOTE_H#include <QString>class Note
{
public:Note();int getId() const;QString getTitle() const;QString getContent() const;QString getModifiedTime() const;void setId(int id);void setTitle(const QString &title);void setContent(const QString &content);void setModifiedTime(const QString &modifiedTime);private:int id;QString title;QString content;QString modifiedTime;
};#endif // NOTE_H
Note.cpp
#include "Note.h"Note::Note() : id(-1), title(""), content(""), modifiedTime("") {}int Note::getId() const { return id; }
QString Note::getTitle() const { return title; }
QString Note::getContent() const { return content; }
QString Note::getModifiedTime() const { return modifiedTime; }void Note::setId(int id) { this->id = id; }
void Note::setTitle(const QString &title) { this->title = title; }
void Note::setContent(const QString &content) { this->content = content; }
void Note::setModifiedTime(const QString &modifiedTime) { this->modifiedTime = modifiedTime; }
3. DatabaseManager 类 (DatabaseManager.h
和 DatabaseManager.cpp
)
DatabaseManager
类用于操作 SQLite 数据库,执行插入、删除、更新和查询等操作。
DatabaseManager.h
#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QList>
#include "Note.h"class DatabaseManager : public QObject
{Q_OBJECTpublic:DatabaseManager();bool openDatabase();bool addNote(const QString &title, const QString &content);bool deleteNote(int id);bool updateNote(int id, const QString &title, const QString &content);QList<Note> getAllNotes();private:QSqlDatabase db;
};#endif // DATABASEMANAGER_H
DatabaseManager.cpp
#include "DatabaseManager.h"
#include <QSqlError>
#include <QDebug>
#include <QDateTime>DatabaseManager::DatabaseManager()
{db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("notes.db");
}bool DatabaseManager::openDatabase()
{if (!db.open()) {qDebug() << "Error: Failed to open database!";return false;}return true;
}bool DatabaseManager::addNote(const QString &title, const QString &content)
{QSqlQuery query;query.prepare("INSERT INTO notes (title, content, modified_time) VALUES (?, ?, ?)");query.addBindValue(title);query.addBindValue(content);query.addBindValue(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));if (!query.exec()) {qDebug() << "Error: Failed to add note!";return false;}return true;
}bool DatabaseManager::deleteNote(int id)
{QSqlQuery query;query.prepare("DELETE FROM notes WHERE id = ?");query.addBindValue(id);if (!query.exec()) {qDebug() << "Error: Failed to delete note!";return false;}return true;
}bool DatabaseManager::updateNote(int id, const QString &title, const QString &content)
{QSqlQuery query;query.prepare("UPDATE notes SET title = ?, content = ?, modified_time = ? WHERE id = ?");query.addBindValue(title);query.addBindValue(content);query.addBindValue(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));query.addBindValue(id);if (!query.exec()) {qDebug() << "Error: Failed to update note!";return false;}return true;
}QList<Note> DatabaseManager::getAllNotes()
{QList<Note> notes;QSqlQuery query("SELECT * FROM notes");while (query.next()) {Note note;note.setId(query.value("id").toInt());note.setTitle(query.value("title").toString());note.setContent(query.value("content").toString());note.setModifiedTime(query.value("modified_time").toString());notes.append(note);}return notes;
}
4. MainWindow 类 (MainWindow.ui
, MainWindow.cpp
和 MainWindow.h
)
在 MainWindow
类中,我们需要显示笔记的列表,包括标题、内容和修改时间,同时实现笔记的添加、删除和保存功能。
MainWindow.ui
在 Qt Designer 中,设计一个界面:
- 使用
QListView
显示笔记列表,格式化显示 标题 和 修改时间。 - 使用
QTextEdit
编辑和显示笔记内容。 - 使用
QPushButton
实现笔记的添加、删除和保存功能。
MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "DatabaseManager.h"
#include "Note.h"
#include <QInputDialog>
#include <QMessageBox>
#include <QDateTime>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);dbManager = new DatabaseManager();// 打开数据库if (!dbManager->openDatabase()) {qDebug() << "Failed to open the database!";return;}// 更新笔记列表updateNoteList();// 连接按钮的信号槽connect(ui->addButton, &QPushButton::clicked, this, &MainWindow::addNote);connect(ui->deleteButton, &QPushButton::clicked, this, &MainWindow::deleteNote);connect(ui->saveButton, &QPushButton::clicked, this, &MainWindow::saveNote);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::updateNoteList()
{// 获取所有笔记QList<Note> notes = dbManager->getAllNotes();QStringList noteTitles;// 格式化笔记标题和修改时间for (const Note ¬e : notes) {QString displayText = note.getTitle() + "\n" + note.getModifiedTime();noteTitles.append(displayText);}// 更新笔记列表显示ui->noteListView->clear();ui->noteListView->addItems(noteTitles);// 更新当前选中的笔记内容if (!notes.isEmpty()) {ui->noteTextEdit->setText(notes.first().getContent());}
}void MainWindow::addNote()
{bool ok;QString title = QInputDialog::getText(this, "New Note", "Enter note title:", QLineEdit::Normal, "", &ok);if (ok && !title.isEmpty()) {dbManager->addNote(title, "");updateNoteList();}
}void MainWindow::deleteNote()
{QModelIndex selectedIndex = ui->noteListView->currentIndex();if (selectedIndex.isValid()) {int noteId = selectedIndex.row() + 1;dbManager->deleteNote(noteId);updateNoteList();}
}void MainWindow::saveNote()
{QModelIndex selectedIndex = ui->noteListView->currentIndex();if (selectedIndex.isValid()) {int noteId = selectedIndex.row() + 1;QString content = ui->noteTextEdit->toPlainText();dbManager->updateNote(noteId, ui->noteListView->currentItem()->text(), content);updateNoteList(); // 更新笔记列表}
}
MainWindow.h
#ifndef MAINWINDOW_H
#defineMAINWINDOW_H#include <QMainWindow>
#include "DatabaseManager.h"namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void addNote();void deleteNote();void saveNote();private:Ui::MainWindow *ui;DatabaseManager *dbManager;void updateNoteList();
};#endif // MAINWINDOW_H
5. 总结
这段代码实现了一个简单的笔记应用,支持:
- 添加笔记:点击按钮输入标题创建新笔记。
- 删除笔记:选择列表中的笔记删除。
- 保存笔记:编辑笔记内容后点击保存。
笔记列表中显示每个笔记的 标题 和 修改时间,通过 SQLite 数据库进行数据存储和管理。
可以进一步扩展应用功能,例如:
- 添加笔记的分类。
- 笔记搜索功能。
- 导出和导入笔记等。
世界上的事情,最忌讳的就是个十全十美,凡事总要稍留欠缺,才能持恒
相关文章:

【QT实战の心情笔记】
文章目录 界面布局主要界面分为三部分:1. 笔记列表区域2. 笔记内容编辑区域3. 操作按钮区域 Qt Designer 界面设计步骤完整界面布局图各控件设置和属性Qt Designer 文件 (.ui) 数据库表结构SQL 表结构: 逻辑代码1. 项目结构2. Note 类 (Note.h 和 Note.c…...

图像生成工具WebUI
介绍 Stable Diffusion WebUI(AUTOMATIC1111,简称A1111)是一个为高级用户设计的图形用户界面(GUI),它提供了丰富的功能和灵活性,以满足复杂和高级的图像生成需求。如今各种人工智能满天飞&…...

排查常见的 MySQL性能问题
1. 查询速度慢:MySQL 数据库中最常见的性能问题之一是查询执行速度慢。缓慢的查询会增加等待时间和阻碍应用程序响应能力,从而显著影响用户体验。这些缓慢的查询可能由各种因素引起,例如缺少适当的索引、设计不佳的数据库架构、查询逻辑本身效…...

滑雪场管理系统
【毕业设计】基于SpringBoot Vue的滑雪场管理系统 摘要 随着信息化时代的快速发展,滑雪场作为冬季旅游的热门目的地,其管理效率和服务质量直接影响着游客的体验。为此,设计一个高效、安全、易用的滑雪场管理系统成为当务之急。本文详细阐述…...

西游记战力排名、笔记等
文章目录 战力排名对西游记的理解各个版本游戏题材西游记关卡和妖怪 西游记家喻户晓,没有谁不知道吧,无论是电视剧、影视,还是小说,乃至游戏,很多地方都有西游记的身影。 虽然知道,但总不如对三国啊、水浒啊…...

vue3 + js + vite创建的项目中配置svg图
安装 npm install vite-plugin-svg-icons npm install fast-globvite.config.js文件中配置如下内容 import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path export defau…...

c++ 找第一个只出现一次的字符
【题目描述】 给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。 【输入】 一个字符串,长度小于100000。 【输出】 输出第一个仅出现一次的字符,若没有则输出no。 【输入样例】 abcabd【输出样…...

在 Unity 6 中使用APV为您的世界创建全局照明的新方法(一)
Unity 6 中推出的新照明功能让您能够更快速、更高效的完成对烘焙场景的照明工作,在本文中我们将与大家详细分享在 Unity 6 中应用自适应探针卷创建快速全局光照的更多细节与具体应用方法。由于内容比较丰富,我们将把内容分为三篇文章,以便大家…...

Win11安装安卓子系统WSA
文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA:Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store,下拉框改为 …...

利用两种方式分别实现单例模式(懒汉式、饿汉式)
package testsingle;//实现单例的两种方式 public class TestMySingle {public static void main(String[] args) {ClassA ca1 ClassA.getClassA();ClassA ca2 ClassA.getClassA();System.out.println(ca1ca2);ClassB cb1 ClassB.getClassB();ClassB cb2 ClassB.getClassB(…...

js分页功能
先声明些全局变量方便我们在下面的代码中使用 //一页有多少条数据 let pagenum 10; //页码下标 let page_index 0; //总页数 let total_page; // 声明一个用于接数据的变量 let data; //获取数据 let res;通过获取数据渲染页面 // 渲染函数 function applys(da…...

Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)保姆级教程
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra为例) 获取源码 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git解压文件 得到如下内容 编译安装修改后的g2o cd g2o_with_orbslam2 mkdir build cd build cmake .. make…...

MyBatis(四)
第一章:MyBatis延迟加载策略 1. 延迟加载的概念 立即加载和延迟加载的区别,使用一对多的环境举例子。 立即加载:当前查询用户的时候,默认也把该用户所拥有的帐户信息查询出来了。 延迟加载:当前查询用户的时候&…...

【从零开始的LeetCode-算法】3285. 找到稳定山的下标
有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山,如果它左侧相邻的山的高度 严格大于 threshold ,那么我…...

Docker常用命令总结~
1、关于镜像 获取镜像 docker pull [image name] [option:tag]AI助手//获取postgres镜像(没有设置镜像版本号则默认获取最新的,使用latest标记) docker pull postgres or docker pull postgres:11.14 列出本地镜像 docker imagesAI助手 指定镜像启动一个容…...

浅谈怎样系统的准备前端面试
前言 创业梦碎,回归现实,7 月底毅然裸辞,苦战两个月,拿到了美团和字节跳动的 offer,这算是从业以来第一次真正意义的面试,遇到蛮多问题,比如一开始具体的面试过程我都不懂,基本一直是…...

如何配置防火墙提高服务器安全性
配置防火墙是提高服务器安全性的重要措施之一。防火墙可以控制网络流量,限制未经授权的访问,防止恶意攻击。以下是配置防火墙以提高服务器安全性的详细指南。 一、为什么需要配置防火墙 防火墙的主要作用是: 限制未经授权的访问:…...

java集合-Map HashMap 源码解析
hashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Ser…...

案例分享|企查查的数据降本增效之路
分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日,企查查正式发布全球首款商查大模型——“知彼阿尔法”,该模型基于企查查覆盖的全球企业信用数据进…...

图书馆管理系统(四)基于jquery、ajax--完结篇
任务3.6 后端代码编写 任务描述 这个部分主要想实现图书馆管理系统的后端,使用 Express 框架来处理 HTTP 请求,并将书籍数据存储在一个文本文件 books.txt 中。 任务实施 3.6.1 引入模块及创建 Express 应用 const express require(express); cons…...

什么是Modbus协议网关?
在工业自动化领域,设备间的通信与数据交换是实现高效、智能控制的关键。Modbus协议作为一种广泛应用的通信协议,自1971年由Modicon公司首次推出以来,便以其标准、开放、支持多种电气接口等特点,在工业控制系统中占据了重要地位。然…...

Docker 容器中启用 SSH 服务
在 Docker 容器中运行 SSH 服务需要一些调整,因为 Docker 容器通常使用 init 系统而不是完整的 systemd。以下是配置 SSH 服务在 Docker Ubuntu 容器中运行的步骤: 1. 安装 SSH 服务 如果还未安装 OpenSSH,请先安装: apt update…...

Linux系统—利用systemd管控系统以及服务详解(十四)
本文为Ubuntu Linux操作系统- 第十四弹~~ 新的一周开始了,时间过得真快,这星期就要冬至啦!! 今天继续Linux系统高级管理板块,主要讲述使用systemd管控系统和服务~ 上期回顾:“Linux系统—进程管理详解” 更…...

人工智能 AI 大模型研究设计与实践应用技术毕业论文
标题:人工智能 AI 大模型研究设计与实践应用技术 内容:1.摘要 人工智能 AI 大模型是当前人工智能领域的研究热点之一,它具有高度的通用性、灵活性和智能性,可以应用于多种领域,如自然语言处理、计算机视觉、语音识别等。本文旨在探讨人工智能…...

已有 containerd 的情况下部署二进制 docker 共存
文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付,相对方便很多,不需要担心别人的环境缺少需要的依…...

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)
名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客,更多详细的安装教程&…...

vue+springboot+cas配置及cookie传递问题
cookie的注意事项 前边的文章已经介绍过cookie的基本信息,这里再次说明一点:cookie是无法进行跨域传递的,很多时候cookie无法设置和传递都是因为跨域问题,ip/端口不一致。 主要就是:被设置cookie和要传递cookie的地址…...

0009.基于springboot+layui的ERP企业进销存管理系统
一、系统说明 基于springbootlayui的ERP企业进销存管理系统,系统功能齐全, 代码简洁易懂,适合小白学编程,课程设计,毕业设计。 二、系统架构 前端:html| layui 后端:springboot | mybatis| thymeleaf 环境:jdk1.8 |…...

ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟
由于需要进行一些FPGA的简单开发,但板载PL端没有焊接晶振,所以需要从PS端借用时钟到PL端使用。 首先新建项目,根据自己的板载选择芯片,我的板载芯片是zynq_7010。 一路next,在自己的vivado的工作文档新建文件夹并给自…...

Android详解——ConstraintLayout约束布局
目录 一、ConstraintLayout概述 二、ConstraintLayout属性介绍 1. 相对位置 2. 边距 3. 中心和偏移位置 中心位置 偏移位置 4. 圆形位置 5. 可见性 6. 尺寸约束 最小尺寸 WRAP_CONTENT :强制约束 MATCH_CONSTRAINT Min和Max 百分比尺寸 比率 7. 链式布局 创建…...