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

相关推荐
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
「QT(C++)开发工程师」9 小时前
【qt版本概述】
开发语言·qt
一路冰雨13 小时前
Qt打开文件对话框选择文件之后弹出两次
开发语言·qt
老赵的博客14 小时前
QT 自定义界面布局要诀
开发语言·qt
码码哈哈0.014 小时前
VSCode 2022 离线安装插件QT VSTOOl报错此扩展不能安装在任何当前安装的产品上。
ide·vscode·qt
feiyangqingyun18 小时前
Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
c++·qt·qt天地图·qt离线地图·qt地图导航
gz94561 天前
windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...
开发语言·qt
「QT(C++)开发工程师」1 天前
Ubuntu 26.04 LTS 大升级:Qt 6 成为未来新引擎
qt
兆。1 天前
python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具
爬虫·python·qt
喝哈喝哈2 天前
pycharm中配置pyqt5
python·qt·pycharm