Qt学习系列之设计模式的小记录

Qt学习系列之设计模式的小记录

  • 前言
  • Qt中的设计模式
  • 使用情况
    • 数据模型
    • 视图组建
    • 代理
  • 小tips
    • 虚函数:
    • 基类的不同
    • 具体使用
      • 界面设计
      • 后台显示
    • 报错解决
  • 总结

前言

在软件设计师中的设计模式有提到设计模式有三种类型:

  • 创建型:工厂方法模式、抽象工厂、原型模式、单例模式、构建器模式
  • 结构型:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式
  • 行为型:模板方法模式、解释器模式、职责链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式
    一共23种设计模式。
    而在Qt中也使用到一些常见的设计模式,今天来详细介绍一下!

Qt中的设计模式

  • 模型-视图-控制器(Model-View-Controller, MVC):用于实现用户界面的常用设计模式。在Qt中,MVC被用来分离数据(模型)、用户界面(视图)和用户输入处理(控制器)。这一类模型在WPF中也常见,后来被分化为MVVM模型。
  • 模型-视图-委托(Model-View-Delegate):MVC的一个变体,它在Qt的模型/视图架构中使用。它引入了"委托"来处理数据项的渲染和编辑。Model/View基本结构:模式是视图与原始数据之间的接口视图就是界面组建。
  • 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知。Qt中的信号和槽机制 就是观察者模式的实现。

使用情况

数据模型

需要了解 QAbstractltemModel 类,用于实现自定义数据模型的基类,可以用于任何类型的视图,包括列表(QListView)、树(QTreeView)、表格(QTableView)等。在它的基础上就衍生了其他很多类,衍生的类就根据特定数据进行的数据模型,而QAbstractltemModel 是处理各种类型的数据结构。

QAbstractltemModel在使用时必须子类化并实现index()\parent()\rowcount()\columncount()\data()

视图组建

需要了解QListView、QTreeView、QTableView这三类,这三类是便利类。当需要处理大数据时,需要使用QAbstractItemView。

代理

QAbstractltemDelegate 是所有代理类的基类,作为抽象类。

小tips

虚函数:

  • 声明:virtual。
  • 重定义:在派生类重定义(override)。
  • 调用:通过基类的指针或引用调用时,会根据对象的实际类型来决定调用哪个版本的函数。
cpp 复制代码
class Base {
public:
    virtual void show() {
        std::cout << "Base show" << std::endl;
    }
    virtual ~Base() {} // 虚析构函数,确保派生类对象的正确释放
};

class AA : public Base {
public:
    void show() override {  // 使用override关键字明确表示重定义
        std::cout << "AA show" << std::endl;
    }
};

这里就是基于base来派生了AA,在AA中使用override来重新定义了show().

基类的不同

  • QWidget:Qt 中所有用户界面对象的基类,基本的窗口功能、非主窗口部分的用户界面。
  • QMainWindow:主窗口框架的基类。
  • QDialog:创建对话框的基类。
    在创建Qt项目时,根据自己的需求进行基类的选择!

具体使用

通过读取数据库中的数据进行案例演示:

界面设计

界面上选择QTableView,可以用于使用数据库数据显示。

后台显示

cpp 复制代码
tableModel=new QSqlQueryModel(this);//定义一个数据库的数据模型。并指定父对象
QSqlDatabase my_db=QSqlDatabase::addDatabase("QSQLITE");
my_db.setDatabaseName("XXX\\DataInfos.db");
if(!my_db.open())
{
    qDebug()<<"打开失败";
    return;
}
QString sql="select * from DataInfo_tab";
tableModel->setQuery(sql);
ui->tableView->setModel(tableModel);
  • tableModel->setQuery(sql); 执行查询。设置模型到视图:通过 ui->tableView->setModel(tableModel); 将模型关联到 QTableView 控件
  • 模型(Model):QSqlQueryModel 是模型,它从数据库查询数据并管理这些数据。QSqlQueryModel 继承自QAbstractTableModel,是 Qt SQL模块提供的一个方便的模型,用于将 SQL 查询结果直接显示在视图中。
  • 视图(View):QTableView 是视图,它显示模型提供的数据。QTableView 可以展示来自 QSqlQueryModel的数据,并且能够通过模型/视图架构与数据进行交互。

报错解决

  • QSqlDatabase::QSqlDatabase(const QString&)' is protected。

    这个能直接用QSqlDatabase来连接数据库,可以把QSqlDatabase db = QSqlDatabase("QDRIVER");改为QSqlDatabase db = QSqlDatabase::addDatabase("QDRIVER");

  • Qt连接成功数据库,库中有表,表中有数,但是没有读出来。

    路径问题!!my_db.setDatabaseName("SQL\DataInfos.db");改成这个
    my_db.setDatabaseName("SQL\\DataInfos.db");。其实就是一个符号的问题!


总结

简单记录一下Qt的Model/View设计模式的使用!

相关推荐
7yewh5 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
mahuifa11 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
冷眼看人间恩怨11 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
云空16 小时前
《QT 5.14.1 搭建 opencv 环境全攻略》
开发语言·qt·opencv
小老鼠不吃猫17 小时前
力学笃行(二)Qt 示例程序运行
开发语言·qt
晓纪同学19 小时前
QT创建一个模板槽和信号刷新UI
开发语言·qt·ui
爱码小白21 小时前
PyQt5 学习方法之悟道
开发语言·qt·学习方法
人才程序员1 天前
QML z轴(z-order)前后层级
c语言·前端·c++·qt·软件工程·用户界面·界面
学习BigData1 天前
【使用PyQt5和YOLOv11开发电脑屏幕区域的实时分类GUI】——选择检测区域
qt·yolo·分类
yerennuo2 天前
FFmpeg库之ffmpeg
qt·ffmpeg