导入QML模块问题



  • 先看第一种情况:
    1.假设现在需要创建一个Test工程,文件结构如下:

    | Test
    | + Component
    | | A.qml
    | | B.qml  
    | main.qml  
    

    2.在QT中创建Test工程:

    | Test.pro
    | +资源
    | |+qml.qrc
    | | |+ /
    | | | | main.qml
    

    3.在项目名处选择添加现有文件A.qml和B.qml(不将A/B.qml添加到资源文件中):

    | Test.pro
    | +资源
    | |+qml.qrc
    | | |+ /
    | | | | main.qml
    | + QML
    | | + Component
    | | | A.qml
    | | | B.qml  
    

    4.在main.qml文件使用了A组件,并且加入了import "./Component",A组件也高亮显示,但是在运行的时候却提示 A is not a type

    第二种情况:
    将第一种情况的第三步变为:A/B.qml文件都添加到资源文件中:

    | Test.pro
    | +资源
    | |+qml.qrc
    | | |+ /
    | | | | main.qml
    | | | | Component/A.qml
    | | | | Component/B.qml
    

    此时在main.qml中不需要import语句可以直接使用A组件。

    第三种情况:
    1.假设现在需要创建一个Test工程,文件结构如下:

    | Test
    | + Component1
    | | A.qml
    | + Component2
    | | B.qml
    | main.qml  
    

    2.同第一种情况2

    3.在项目名处选择添加现有文件A.qml和B.qml(不将A/B.qml添加到资源文件中):

    | Test.pro
    | +资源
    | |+qml.qrc
    | | |+ /
    | | | | main.qml
    | + QML
    | | + Component1
    | | | A.qml
    | | + Component2
    | | | B.qml
    

    4.在A组件中使用了B组件,并且加入了import "./Component",正常。

    所以我想问: 资源文件中的QML文件使用的自定义组件是否必须要添加到资源文件中才能使用?



  • @kian

    用到了 qrc 比如是新建了一个带有c++代码的项目。但是仔细想想,如果你是想探索使用纯QML实现的模块,那么新建一个 QtQuick UI 这个纯QML想更加有助于理解QML模块的概念。

    如何在 QtQuick 项目中正确使用 qrc,这是一个指定思考的问题,你可以@Jason

    可以看看

    在qml工程中怎么使用qmldir进行模块管理

    自定义QML模块

    下面是有关 QtQuick UI 的问答。

    什么是 QtQuick UI

    1. 是一个由 qmlproject 为后缀名的文件所管理的纯 QML 项目。

    2. qmlproject 文件本身就是 qml 的语法。

    3. 按下 ctrl + N,仔细找,一定能找到 QtQuick UI 这个选项的。

    使用 QtQuick UI 项目有什么好处?

    1. 首先 QtQuick UI 是一个纯 QML 项目,没有 c++ 的文件,也就意味着不用编译c++,就像浏览器打开 html 那样,QML 的文件使用一个名为 qmlscene 的程序打开的。

    2. 其次使用 QML 的目的是快速开发,而c++ 和 qrc 资源文件漫长的编译时间让快速开发成为一个不小的障碍。

    既然 QtQuick UI 是纯 QML 项目,是不是意味着无法直接和 C++ 交互?

    是的,但是可以通过插件的方式来处理, qmlscene 支持加载 QtQuick 2 插件。怎么构建 一个 QtQuick 2 插件呢?直接搜索即可找到你想要的。

    既然 qmlproject 是纯 QML 项目的项目文件,那么和 pro 有什么类似的功能吗?

    1. pro 文件是管理 Qt C++ 的项目文件,可以在里面指定源码, qrc 资源,OTHER_FILES,c\c++ 库。

    2. 相对于 proqmlproject 也有源码和资源的概念。源码直接是 *.qml,资源的话,一般是指图片。

    3. 这里给出一些使用技巧。先看如下的代码示例:

    /* File generated by Qt Creator */
    
    import QmlProject 1.1
    
    Project {
         mainFile: "main.qml"
    
        /* Include .qml, .js, and image files from current directory and subdirectories */
        QmlFiles {
            directory: "."
        }
        JavaScriptFiles {
            directory: "."
        }
        ImageFiles {
            directory: "."
        }
        /* List of plugin directories passed to QML runtime */
        // importPaths: [ "../exampleplugin" ]
    }
    

    语法是 QML,有 import,也有一个根对象。

    mainFile: "main.qml"

    这个项目文件指明了此项的入口文件是 main.qml

    如果你把行代码注释的话,是不是这个项目就没有入口文件,然后就无法启动了呢?

    答案是否定的。由于没有在 qmlproject 中指定入口文件,所以 qmlscene 就会直接运行当前,你所打开的那个 qml 文件。这样就可以有更高级的用法了。例如我编写一个 test_my_button.qml 用来测试自定义的 Button,此时只要注释掉 qmlproject 中的 mainFile ,然后在编辑器打开 test_my_button.qmlctrl+R 运行,就可以看到按钮的效果了,测试变得如此简单

    往下看 QmlFiles,嗯,见文生义。就是指定 directory (目录)下的所有 *.qml 文件。

    其他 JavaScriptFilesImageFiles

    然后你问我想在我这个 QtQuick UI 项目中显示其他格式的文件,怎么写?

    这里就要祭出 Files 了。

    Files {
        fileter: "*.md"
        directory: "."
    }
    

    这段就是获取所有文件后缀名为 md 的文件。

    importPaths 这个东西文章不好写。你直接看这个项目 Sparrow.2,代码层面去理解他吧。(下载,然后用 QtCreator 打开 *.qmlproject 文件)。

    QtQuick 进阶

    未完待续。

    如果你觉得赞,可以去我 github follow 我,或者去我的博客,亦或者继续回复,问你的问题。



  • @qyvlik 很强大的小q,拿出了QBS作为构建系统。这里也就接着qyvlik来回答你的问题了。
    首先,import语句能够访问文件路径、资源路径以及网络路径。这个是要清楚的。
    其次,如果你创建的不是纯Qt Quick UI项目,那么C++文件是必不可少的,此时需要了解的是,组件是否能够被找到取决于我们的QQmlApplicationEngine::importPathList( )下面有没有我们制作的组件。最后,使用qrc:/开头的相对路径可以很容易保证当我们复制整个项目的时候,相对路径都不会变。另外,将QML放入资源几乎不会拖慢加载速度。因为事实上,QML文件比图片、音频文件小得多,所以值得推荐。



  • @jiangcaiyang

    好像没有说到 QBS 。



  • @qyvlik
    感谢回答!之前没有用过qmlproject。
    QT用了大半年了,所写的代码基本上都是C++/QML混合编程,GUI和逻辑分成两端来处理。功能是实现了,但是文件结构很乱,而且代码再利用率很低,常用组件没有分离出来。所以想对文件结构做一个调整,但是我又不想将所有的常用组件丢到qml.qrc里面去,看起来感觉很乱。
    按照你所给的Sparrow例子,将常用的QML组件做成一个module,然后在其他的qmlproject的importPaths中加入该module的路径,的确时可以改善文件结构。与C++进行交互的时候,也可以直接定义一个接口类,并将该类作为插件导入到qmlproject中。但是采用这种方法,只是提供一个快速预览的功能,并不能发布一个可执行文件。所以,如果我需要发布一个可执行文件,仍然需要使用pro文件。
    根据你提供的资料,我想到了两种方法对文件结构进行优化:
    1.创建多个qrc文件,每个qrc文件中加入对应类型的常用组件,组件之间可以相互使用,不需要import语句。
    2.将常用的组件全部打包做成一个module,然后修改.pro文件的QML_IMPORT_PATH , 并且在main.cpp中调用addImportPath()导入module路径,最后在工程中需要使用该module的qml文件中使用import语句导入该module即可。



  • @qyvlik 你建立的QmlProject就是QBS构建系统的哦。😽



  • @jiangcaiyang导入QML模块问题 中说:

    QBS构建系统

    QT的构建系统不是分为三类:qmake,qbs,qmlproject吗



  • @kian 我混乱了,我一直认为qmlproject是基于QBS的一个项目类型,QBS是构建系统。



  • @kian Qt的构建系统是cmake、qmake、qbs。🐄 🐄 🐄


 

最近的回复

  • 随后在git for windows这个软件中输入

    git clone git@git.coding.net:jiangcaiyang1/qtdreamrelease_windows.git

    就可以获得一个空的项目了。其它的项目也是同样的操作方法。然后呢,将此作为自动构建的代码库吧。
    此次介绍就是这样~😘 😘 🐧

    阅读更多
  • 0_1540027445466_很好.jpg
    萌梦安装包的分发始终是一个难题。要有一个稳定并且有效的方法进行分包,才能让大家都能够享受到萌梦动作编辑器的最新功能。我们目前有两种分发的方法:

    离线安装包。通常的位置是
    1.1 百度云盘
    1.2 QQ群文件
    1.3 github
    其中百度云盘和QQ群文件不会定期地更新,只有github的文件会定期更新。因为构建脚本要求每次有更改,都让github的文件更新。

    在线安装包。通常的位置是
    2.1 百度云盘
    2.2 QQ群文件
    2.3 github
    这里在线安装包的代码库主要还是在github中,在线安装包非常依赖CDN加速。目前github这块儿在国内做得不太好,还是希望在国内找一个类似的加速。目前可以选的只有两家:

    码云

    coding

    因为以前做过coding的加速,目前coding已经和腾讯云战略合作,所有的代码都要迁移到腾讯云了。而且对于代码库的空间要求变高了。128M。目前我的一个账号显然满足不了要求。所以有必要再注册一个账号。

    下面记录一下新建coding代码库的方法,并且尝试将萌梦安装包的线上代码库部分移动到coding代码库中。

    注册

    到这个位置注册。

    https://coding.net/register

    相信很快就会带你跳转到腾讯云中。不过这里我选择的是邮箱的方式,因为我希望注册尽量多的账号。

    设置ssh密钥

    进入控制台后,是这样的:
    0_1540028446495_2eeb7e93-c15b-4c82-9b36-58e1c304ea3f-image.png
    这个时候,我们要先创建项目,然后ssh的公钥。
    0_1540028822318_b3e81b93-099c-42d5-820d-deaf8d445913-image.png

    创建以后,开始部署公钥。在这里:
    0_1540028925337_d8059b64-8535-45e5-ba4c-d7454505aa5a-image.png
    这期间最好用OpenSSL生成SSH密钥。
    我使用的是git for windows来生成密钥的。方法是

    ssh-keygen

    如果你生成好了密钥,可以直接打开密钥内容看看:

    cat ~/.ssh/id_rsa.pub

    然后粘贴到网站的文本框中。

    添加好了之后,勾选“准许推送权限”,需要推送代码到代码库中。

    阅读更多

关注我们

微博
QQ群











召唤伊斯特瓦尔