备忘
MVC模型
https://worthsen.blog.csdn.net/article/details/103934965?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
- model:数据结构模型,负责数据的请求和更新
- view:界面
- control:负责数据结构与界面的交互,尽量精简
- 委托:委托是视图中处理用户输入的组件。
Qt提供了现成的类进行 MVC模式编程;QAbstractTableModel
View层,单独实现了组合模式
Model层和View层,实现了观察者模式
View层和Controller层,实现了策咯模式
Qt插件编程
- 方便功能的扩展;更新量小;降低模块之间依赖
- 主系统;插件管理器;插件
- 实现方法
https://github.com/qht1003077897/QtPluginDemo.git
- 主系统启动初始界面和插件管理器
- 插件管理器负责动态加载插件,以及分发传递插件之间的消息
- 插件需要有一个统一的接口文件定义插件间的通讯;自定义的交互数据;交互地数据可以是己方的控件
- 实例
//step 1 定义接口
class RegExpInterface
{
public:
virtual ~RegExpInterface() {}
virtual QString regexp(const QString &message) = 0;
};
// step 2
// 声明接口
// 使用 Q_DECLARE_INTERFACE 宏,是为了让Qt元对象系统知道该接口,这样以来,在运行时便可以识别实现接口的插件。
// Q_DECLARE_INTERFACE(接口类名, 接口标识),第二个参数(RegExpInterface_iid)是一个标识接口的字符串,必须唯一。
#define RegExpInterface_iid "org.qter.Examples.myplugin.RegExpInterface"
Q_DECLARE_INTERFACE(RegExpInterface,RegExpInterface_iid )
#endif // REGEXPINTERFACE_H
---
//step 3 实现接口
class REGEXPLUGINSHARED_EXPORT RegexPlugin : public QObject,RegExpInterface
{
Q_OBJECT
//Q_PLUGIN_METADATA宏用于描述插件元数据,第一个参数为插件的 IID,与接口定义的IID相同
//第二个参数FILE是可选的,指定一个本地json文件,该文件中可以描述插件的相关数据信息
Q_PLUGIN_METADATA(IID RegExpInterface_iid FILE "regexplugindata.json")
//Q_INTERFACES 宏用于告诉 Qt 该类实现的接口。
Q_INTERFACES(RegExpInterface)
public:
RegexPlugin();
// RegExpInterface interface
public:
QString regexp(const QString &message);
};
---
// 进入插件目录
QDir pluginsDir(qApp->applicationDirPath());
pluginsDir.cd("bin");
// 遍历插件目录
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = pluginLoader.instance();
if (plugin) {
//取回json文件的内容
QJsonObject w = pluginLoader.metaData().value("MetaData").toObject();
qDebug()<<w;
regexpInterface = qobject_cast<RegExpInterface *>(plugin);
if (regexpInterface)
return true;
}
}
return false;
- C++ 开发者通常会将只包含 public 纯虚函数的类当做接口。在 Qt Creator 中,接口则是拥有一个或多个纯虚函数的 QObject 子类