模块化开发
什么是模块化开发呢?
举个例子:
我们有一台台式电脑,我们台式电脑有显卡,内存,磁盘,cpu,键盘,鼠标等
你可以将这些部件当做模块
我们鼠标坏了换鼠标,我们显卡坏了换显卡
以前是焊死在一起的,坏了一块就得全部丢了,现在不一样了,模块化合并?
哪里坏了,替换哪里,哪里更新换代了,我们买个新的换上去就行了?
好了,说回代码,无论是c++,还是qml模块化管理
都离不开 .pri文件 有了它我们可以快速引入到自己的项目中,我们只需要拷贝某个模块项目的程序
然后在我们的程序里面,在工程文件.pro里面使用
include($$PWD/???/demo.pri)
如果是c++模块那么直接用就可以了
如果是qml模块那就我们的main.cpp里面多做一点处理
封装c++模块并使用
请参考跳转
封装qml模块并使用
而qml模块化开发主要围绕着两个问题展开细说
①QML module not found
②QML module not installed
qml模块化开发有两个方法
1)封装qml扩展插件
a) 纯c++扩展插件,里面都是继承qquickitem 或者 qquickpainteditem 封装的组件,通过qmlregistertype注册到项目中,最终打包成一个静态库或者动态库
b) 含有qml的扩展插件,实际封装方式跟纯c++差不多,都是打包成一个库,但是如果扩展插件携带了qml也要一并输出
--------------------------后续补充
2)单纯源码模块化
├── po-ui.pro
├── po-ui.pro.user
├── src
│ ├── qml
│ │ ├── Potato
│ │ │ ├── Controls
│ │ │ │ ├── Button
│ │ │ │ │ └── Button.qml
│ │ │ │ ├── Controls.pri
│ │ │ │ ├── potato-controls.qrc
│ │ │ │ ├── qmldir
│ │ │ │ └── theme
│ │ │ └── Potato.pri
│ │ └── qml.pri
│ └── src.pri
└── test
├── main.cpp
├── main.qml
├── qml.qrc
└── test.pri
我们的项目结构应当如上述所示
我们的源码都会存放到src目录下
而src目录下有个目录专门管理qml库资源(非views界面,views界面应当是跟qml同级目录,views就是程序渲染界面)
qml作为自定义三方qml库资源搜索路径,所以
qml.pri
# ①用于mian.cpp中engine.addImportPath(QML_IMPORT_PATH);
# 解决QML module not installed
DEFINES = QML_IMPORT_PATH=\\\"$${PWD}\\\"
# ②高亮,解决QML module not found
QML_IMPORT_PATH += $$PWD
# ③以下则引入模块资源
include($$PWD/Potato/Potato.pri)
main.cpp 安装qml库资源
QQmlApplicationEngine engine;
engine.addImportPath(QML_IMPORT_PATH);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
引入模块
import 的模块名跟跟qmldir里面定义的module 后面接的名字有关系吗?
并没有关系,你甚至不写module 都可以
那import 后面接的模块是怎么来的?
应该是根据qmldir文件在目录中的结构而来,Potato目录-》Controls目录 -》qmldir
故Potato.Controls
使用自定义模块应当加入别名as Po
因为自定义qml文件命名可能跟官方自带组件的可能重名,会导致混乱使用,使得代码增加隐患
import QtQuick 2.12
import QtQuick.Window 2.12
import Potato.Controls 1.0 as Po
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Po.Button{
text: qsTr("open")
}
}