【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. 笔记列表区域(显示所有笔记的标题和修改时间)
  2. 笔记内容编辑区域(编辑选中的笔记的内容)
  3. 操作按钮区域(添加、删除、保存等按钮)
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 中,你可以按照以下步骤创建界面:

  1. 创建一个 QMainWindow

    • 选择 QMainWindow 作为主窗口类型。
  2. 添加一个 QWidget

    • 将一个 QWidget 拖入 QMainWindow 中,作为主界面的容器。
  3. 设置布局

    • QWidget 中,设置一个 QHBoxLayoutQVBoxLayout 来组织控件。
    • 推荐使用 QVBoxLayout,将界面分成垂直区域。
  4. 添加 QListView 控件

    • 在上方区域添加一个 QListView 控件,宽度设置为适当的大小来显示笔记的标题和修改时间。
    • 设置 QListView 的大小策略,使其能够填充上方区域。
  5. 添加 QTextEdit 控件

    • 在下方区域添加一个 QTextEdit 控件,用来显示和编辑笔记的内容。
    • 设置其大小策略,使其填充剩余的空间。
  6. 添加操作按钮

    • 在界面底部,使用 QHBoxLayout 添加三个按钮:
      • Add 按钮:用于创建新笔记。
      • Delete 按钮:用于删除选中的笔记。
      • Save 按钮:用于保存当前编辑的笔记。

完整界面布局图

--------------------------------------
|             笔记列表区域            |
|------------------------------------|
| Title 1       2024-12-18 15:30:00  |
| Title 2       2024-12-17 14:20:00  |
| ...                                  |
--------------------------------------
|             笔记内容编辑区域        |
|------------------------------------|
| [此处显示或编辑笔记内容]              |
--------------------------------------
|      [Add]    [Delete]    [Save]    |
--------------------------------------

各控件设置和属性

  1. QListView

    • 需要绑定一个 QStringListModelQListView 模型来显示笔记的标题和修改时间。
    • 在模型中,每个条目应当是 “标题 + 修改时间”。
  2. QTextEdit

    • 设置 setPlainText()setHtml() 方法来显示笔记内容。
    • 用户可以编辑其中的内容。
  3. 按钮

    • 设置按钮的文本为 AddDeleteSave,并为这些按钮添加相应的信号与槽连接。

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.hNote.cpp:定义笔记类。
  • DatabaseManager.hDatabaseManager.cpp:管理数据库的类。
  • MainWindow.ui:Qt Designer 设计的主窗口界面。
  • MainWindow.cppMainWindow.h:主窗口的实现和交互逻辑。

2. Note 类 (Note.hNote.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.hDatabaseManager.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.cppMainWindow.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 &note : 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 数据库进行数据存储和管理。

可以进一步扩展应用功能,例如:

  • 添加笔记的分类。
  • 笔记搜索功能。
  • 导出和导入笔记等。

世界上的事情,最忌讳的就是个十全十美,凡事总要稍留欠缺,才能持恒

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

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

相关文章

大模型学习笔记------SAM模型详解与思考

大模型学习笔记------SAM模型详解与思考 1、SAM框架概述2、Segment Anything Task3、Segment Anything Model SAM模型是Meta 提出的分割一切模型&#xff08;Segment Anything Model&#xff0c;SAM&#xff09;突破了分割界限&#xff0c;极大地促进了计算机视觉基础模型的发展…

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…

2024最新qrcode.min.js生成二维码Demo

找了一堆代码一堆GPT&#xff0c;终于给写对了&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

【Spring】Spring的模块架构与生态圈—核心容器(Beans、Core、Context、Expression)

Spring框架因其强大的功能和灵活性而成为企业级应用开发的首选&#xff0c;它的模块化设计使得开发者可以根据需求选择合适的模块&#xff0c;降低了系统的复杂性。核心容器模块是Spring框架的基础&#xff0c;它为整个框架提供了核心功能&#xff0c;包括Bean的管理、上下文的…

CRC校验例题详解

CRC校验例题详解 示例题目 给定数据帧1101001和生成多项式G(x)x4x3x21&#xff0c;求该数据帧的CRC校验码&#xff0c;并验证传输过程中是否会出现错误。 解题步骤 第一步转换生成多项式&#xff1a; 接下来是对这一步骤的详细解答&#xff1a; 生成多项式的二进制表示 当我们…

02、服务器的分类和开发项目流程

硬件介绍 1、服务器分类2.开发流程 1、服务器分类 1.1 服务器分类 1u服务器&#xff08;u表示服务器的厚度&#xff09; 1U4.45cm&#xff1b; 4u服务器&#xff08;u表示服务器的厚度&#xff09; &#xff0c; 服务器有两个电源模块&#xff0c;接在不同的电源&#xff0c;…

GIT命令使用手册(详细实用版)

一、git常用操作参考 第一次提交完整步骤&#xff1a; 1.git init; 2.git add . 3.git commit -m "初始化" 4.git remote add origin https://github.com/githubusername/demo.git 5.git pull origin master 6.git push -u origin master&#xff08;使用-u选项可以将…

图像生成工具WebUI

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

9 OOM和JVM退出。OOM后JVM一定会退出吗?

首先我们把两个概念讲清楚 OOM是线程在申请堆内存&#xff0c;发现堆内存空间不足时候抛出的异常。 JVM退出的条件如下&#xff1a; java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程&#xff0c;服务于用户线程。 我们简单说下守护线程的功能: 1.日志的记录…

面试经典题目:LeetCode274_H指数

leetcode274——H指数 暴力循环代码分析性能分析 方法1&#xff1a;排序加线性扫描算法步骤&#xff1a; 方法2&#xff1a;计数排序&#xff08;适用于引用次数有上限&#xff09;算法步骤&#xff1a; 题目链接&#xff1a;leetcode274_H指数 暴力循环 class Solution { publ…

【前端爬虫】关于如何获取自己的请求头信息(user-agent和cookie)

注意&#xff1a;由于user-agent和cookie中保存了部分账户信息&#xff0c;所以一定不要随意泄露给他人&#xff01;&#xff01;&#xff01; 1.首先打开某个页面&#xff0c;点击键盘的F12键进入控制台&#xff0c;或者鼠标右键页面选择打开控制台 2.然后点击控制台上方的网…

爬虫抓取的数据如何有效存储和管理?

在现代数据驱动的世界中&#xff0c;爬虫技术已成为获取网络数据的重要手段。然而&#xff0c;如何有效地存储和管理这些数据是一个关键问题。本文将详细介绍几种有效的数据存储和管理方法&#xff0c;并提供相应的Java代码示例。 1. 数据存储方式 1.1 文件存储 文件存储是最…

将java项目部署到linux

命令解析 Dockerfile: Dockerfile 是一个文本文件&#xff0c;包含了所有必要的指令来组装&#xff08;build&#xff09;一个 Docker 镜像。 docker build: 根据 Dockerfile 或标准指令来构建一个新的镜像。 docker save: 将本地镜像保存为一个 tar 文件。 docker load: 从…

Next.js 13 App Router实战踩坑与性能优化指南

去年年底&#xff0c;我接了一个海外客户的项目&#xff0c;要求使用 Next.js 13 的 App Router 开发一个数据分析平台。说实话&#xff0c;当时虽然对 Next.js 已经很熟悉了&#xff0c;但对 App Router 这个相对较新的特性还是有些忐忑。现在项目已经成功上线&#xff0c;我想…

MySQL 中快速插入大量数据

在 MySQL 中快速插入大量数据&#xff08;例如 20 万条记录&#xff09;可以通过多种方法实现。以下是一些优化技巧和步骤&#xff0c;可以帮助你高效地插入大量数据&#xff1a; 1. 禁用索引和约束&#xff08;如果可能&#xff09; 在插入大量数据之前&#xff0c;禁用索引和…

Chrome 浏览器原生功能截长屏

我偶尔需要截取一些网页内容作为素材&#xff0c;但偶尔内容很长无法截全&#xff0c;需要多次截屏再拼接&#xff0c;过于麻烦。所以记录下这个通过浏览器原生功能截长屏的方案。 注意 这种方案并不是百分百完美&#xff0c;如果涉及到一些需要滚动加载的数据或者悬浮区块&am…

Python+OpenCV系列:AI看图识人、识车、识万物

在人工智能风靡全球的今天&#xff0c;用 Python 和 OpenCV 结合机器学习实现物体识别&#xff0c;不仅是酷炫技能&#xff0c;更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入&#xff0c;识别人、动物、车辆及其他物品&#xff0c;让你的程序瞬间具备 AI …

关于如何正确在测试用例中mock静态方法的问题

文章目录 情况一&#xff1a;希望在测试用例中直接执行静态方法的逻辑情况二&#xff1a;不希望在测试用例中执行静态方法的逻辑插桩方法坑1: 报错SubclassByteBuddyMockMaker原因与解决方案坑2&#xff1a;报错 the existing static mock registration must be deregistered原…

Shell自定义(二)

1.Shell自定义 1.初始化 定义全局变量environ&#xff0c;把g_env的内容用memset初始化为0&#xff0c;这里用malloc开辟的空间为对应环境变量的长度1&#xff0c;多1位置是最后结束符0&#xff0c;strcpy把此时的对应的环境变量拷贝到g_env里面&#xff0c;下面是新增一个环…

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql