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)。
- 调用:通过基类的指针或引用调用时,会根据对象的实际类型来决定调用哪个版本的函数。
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,可以用于使用数据库数据显示。
后台显示
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设计模式的使用!