Qt项目锻炼——TODO清单(一)

这是我Github项目的网址Ducker-Fry/TODOListhttps://github.com/Ducker-Fry/TODOList#

最开始的任务

第一步,基础框架搭建(1-2天)

创建 Qt Widgets Application 项目

实现 DatabaseManager 类,完成数据库初始化

创建 Qt Widgets Application 项目

选择合适的开发工具

可以使用Qt开发工具——Qt designer本身,因为我在Visual Studio上编程习惯且VS上面代码补全、Github Copilot确实用起来非常方便,所以选择在VS上写代码,使用拓展插件QT tools,具体的配置教程大家可以上B站去搜,我不过多赘诉。

创建Qt Widgets Application项目

先点开开始界面,点击创建新项目

选择窗口应用,就是右边的Qt Widget Application

这里自己放到合适的位置和取名

后面点击创建,其他设置不用管,直接点下一步就可以了,如果什么不懂就截屏问AI。

2. 实现 DatabaseManager 类,完成数据库初始化

步骤
  1. 包含必要的头文件:在 database_manager.h 中包含 QObjectQSqlDatabase 等必要的头文件。
  2. 设计类结构:定义 DatabaseManager 类,包含必要的成员变量和方法。
  3. 实现数据库初始化方法:在 database_manager.cpp 中实现 initDatabase 方法,完成数据库的连接和表的创建。

头文件
#pragma once  
#include <QtCore/QObject>  
#include <QtSql/QSqlDatabase> 
#include <QtCore/QString>  

class DatabaseManager : public QObject {  
  Q_OBJECT  
public:  
  static DatabaseManager& instance();  
  bool initDatabase(const QString& dbPath = "todo.db");  
  QSqlDatabase database() const;  

  // 数据库操作方法  
  bool createTables();  
  bool backupDatabase(const QString& backupPath);  

private:  
  explicit DatabaseManager(QObject* parent = nullptr);  
  ~DatabaseManager();  
  Q_DISABLE_COPY(DatabaseManager)  

  QSqlDatabase m_db;  
};
源文件
#include "DatabaseManager.h"
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QDebug>

DatabaseManager& DatabaseManager::instance() {
    static DatabaseManager instance;
    return instance;
}

DatabaseManager::DatabaseManager(QObject* parent) : QObject(parent) {
    // 初始化数据库驱动
    m_db = QSqlDatabase::addDatabase("QMYSQL");
    m_db.setHostName("localhost");
    m_db.setDatabaseName("todo_db");
    m_db.setUserName("your_username");
    m_db.setPassword("your_password");
}

DatabaseManager::~DatabaseManager() {
    if (m_db.isOpen()) {
        m_db.close();
    }
}

bool DatabaseManager::initDatabase(const QString& dbPath) {
    if (!m_db.open()) {
        qDebug() << "Failed to open database:" << m_db.lastError().text();
        return false;
    }
    return createTables();
}

QSqlDatabase DatabaseManager::database() const {
    return m_db;
}

bool DatabaseManager::createTables() {
    QSqlQuery query(m_db);
    QString createTableQuery = "CREATE TABLE IF NOT EXISTS tasks ("
                               "id INTEGER PRIMARY KEY AUTO_INCREMENT,"
                               "title TEXT NOT NULL,"
                               "description TEXT,"
                               "priority INTEGER DEFAULT 1,"
                               "due_date DATE,"
                               "completed BOOLEAN DEFAULT 0,"
                               "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP"
                               ")";
    if (!query.exec(createTableQuery)) {
        qDebug() << "Failed to create table:" << query.lastError().text();
        return false;
    }
    return true;
}

bool DatabaseManager::backupDatabase(const QString& backupPath) {
    // 实现数据库备份逻辑
    return false;
}


目前在你DatabaseManager::DatabaseManager 构造函数中,数据库的连接参数(如主机名、数据库名、用户名、密码)是硬编码在代码里的:

m_db.setHostName("localhost");
m_db.setDatabaseName("todo_db");
m_db.setUserName("your_username");
m_db.setPassword("your_password");

•    现在,数据库初始化参数不是用户自己配置,而是写死在代码中的。
•    如果你希望让用户自行配置这些参数,通常做法是:
•    从配置文件(如 .ini、.json 等)读取参数;
•    或在程序启动时通过界面让用户输入。

3.设计 Task 实体类

步骤
  1. 定义枚举类型:定义 Priority 枚举类型,表示任务的优先级。
  2. 设计类结构:定义 Task 类,包含任务的基本属性和访问器方法。
  3. 实现辅助方法:实现 isOverdue 和 priorityString 等辅助方法。
头文件
#ifndef TASK_H
#define TASK_H

#include <QString>
#include <QDate>

class Task {
public:
    enum Priority { Low = 1, Medium = 2, High = 3 };
    
    Task() = default;
    Task(int id, const QString& title, const QString& description, 
         Priority priority, const QDate& dueDate, bool completed);
    
    // Getters and setters
    int id() const;
    QString title() const;
    QString description() const;
    Priority priority() const;
    QDate dueDate() const;
    bool completed() const;
    
    void setId(int id);
    void setTitle(const QString& title);
    void setDescription(const QString& description);
    void setPriority(Priority priority);
    void setDueDate(const QDate& dueDate);
    void setCompleted(bool completed);
    
    // 辅助方法
    bool isOverdue() const;
    QString priorityString() const;

private:
    int m_id = -1;
    QString m_title;
    QString m_description;
    Priority m_priority = Medium;
    QDate m_dueDate;
    bool m_completed = false;
};

#endif // TASK_H

源文件

#include "task.h"

Task::Task(int id, const QString& title, const QString& description, 
           Priority priority, const QDate& dueDate, bool completed)
    : m_id(id), m_title(title), m_description(description), 
      m_priority(priority), m_dueDate(dueDate), m_completed(completed) {}

int Task::id() const {
    return m_id;
}

QString Task::title() const {
    return m_title;
}

QString Task::description() const {
    return m_description;
}

Task::Priority Task::priority() const {
    return m_priority;
}

QDate Task::dueDate() const {
    return m_dueDate;
}

bool Task::completed() const {
    return m_completed;
}

void Task::setId(int id) {
    m_id = id;
}

void Task::setTitle(const QString& title) {
    m_title = title;
}

void Task::setDescription(const QString& description) {
    m_description = description;
}

void Task::setPriority(Priority priority) {
    m_priority = priority;
}

void Task::setDueDate(const QDate& dueDate) {
    m_dueDate = dueDate;
}

void Task::setCompleted(bool completed) {
    m_completed = completed;
}

bool Task::isOverdue() const {
    return !m_completed && m_dueDate.isValid() && m_dueDate < QDate::currentDate();
}

QString Task::priorityString() const {
    switch (m_priority) {
        case Low: return "Low";
        case Medium: return "Medium";
        case High: return "High";
        default: return "";
    }
}

这是最基本的框架吧,基本上是跟着AI走,我也是第一次真正开始用Qt开发应用,最难的是如何下手。肯定不能全靠AI,后面会优化,添加注释和新功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值