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设计模式的使用!

相关推荐
xcyxiner1 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz5 天前
QML Hello World 入门示例
qt
xcyxiner8 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner9 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner10 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能12 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G12 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
森G12 天前
77、线程池原理和实现------服务器源码解析----云视频服务项目
服务器·c++·qt