- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经构建了一个静态 Qt 库,并希望使用它通过独立的 exe 部署我的应用程序。经过一天的努力,我知道qtquick插件不能静态包含到exe中。
我需要将qml
文件夹中的一些文件夹复制到我的exe目录中,让exe可以显示GUI。
所以我想知道我的exe需要哪个文件,我一个一个地删除了那些文件夹中的文件以了解它。真正需要的文件只是一个 plugins.QMLTYPES
文件和一个 qmldir
文件。
然后我发现 QQmlApplicationEngine
的导入路径可以改变,我输出 QQmlApplicationEngine.importPathList()
并且路径之一就是 qml
Qt 安装路径中的文件夹。 所以我认为这是Qt获取plugins.QMLTYPES
文件和qmldir
文件搜索路径的地方。
如果我认为是正确的,我可以将我需要的文件夹复制到 qrc
文件中并使用 QQmlApplicationEngine.addImportPath("qrc:/foldersIwant")
让exe 可以在运行时导入它需要的东西。而且因为 qrc
被编译成 exe,我可以摆脱那些文件夹,让我的 exe 独立。
但是在我的代码中执行此操作后,即使 QQmlApplicationEngine.importPathList()
的输出有我放入的路径,应用程序仍然找不到它需要的文件,我也检查了我的路径根据 Load qmldir from QRC file .
代码如下:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.addImportPath(QStringLiteral("qrc:/import/qtquick/"));
qDebug()<<engine.importPathList();
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();
}
这是我的qrc文件的一部分
我的演绎有什么问题吗?
进一步研究:
我已经添加了engine.addImportPath(QDir::currentPath() + QDir::separator() + "custom");
并将所有文件夹移动到custom
文件夹中,即可成功运行。并且没有此行的 exe 无法在 custom
文件夹中运行。所以我想知道“搜索”行为不能应用于 qrc
文件吗?
最佳答案
我终于得到了答案。结果证明我所有的想法都是正确的!
以下是我尝试过的方法,您可以阅读结尾以获得清晰的步骤。
我的目标是编译一个独立的 qml2 应用程序 exe。
在 qml1 中,我可以构建静态 Qt 库并使用它编译我的应用程序。
在qml2中,exe可以用同样的方式编译。但是如果我在没有 Qt-Runtime 的情况下运行它。它只是在 Windows 操作系统上没有显示任何窗口(在其他操作系统中也没有显示)。 google了很多资料,发现这个问题从Qt5.0开始就困扰了很多人。现在是Qt5.5了,他们还没有修复。 所以我需要将 QT_INSTALLED_PREFIX/qml
中的文件夹复制到我的应用程序的根目录中,让我的应用程序显示 GUI。
虽然问题会在Qt5.6(https://codereview.qt-project.org/#/c/114835/)中得到解决,但我等不了这么久了(Qt5.6将在今年年底发布)。所以我决定自己打包文件。
我偶然看到这个问题:Load qmldir from QRC file .它告诉我 qmldir 文件可以包含到 qrc 文件中,Qml 引擎可以搜索到那些目录。所以我认为,QML 文件也可以包含到 qrc 文件中。
但首先要找到导入qml2的地方,当我查看QQmlApplicationEngine的文档时,我发现了addImportPath
函数,我告诉自己这一定是找到导入路径的关键。文档告诉我一切:
QStringList QQmlEngine::importPathList()
const Returns the list of
directories where the engine searches for installed modules in a
URL-based directory structure.For example, if /opt/MyApp/lib/imports is in the path, then QML that
imports com.mycompany.Feature will cause the QQmlEngine to look in
/opt/MyApp/lib/imports/com/mycompany/Feature/ for the components
provided by that module. A qmldir file is required for defining the
type version mapping and possibly QML extensions plugins.By default, the list contains the directory of the application
executable, paths specified in the QML2_IMPORT_PATH environment
variable, and the builtin Qml2ImportsPath from QLibraryInfo.
我在运行时删除importPathList中的Qml2ImportsPath后,重现了app不显示任何GUI的bug。
addImportPath
的文档告诉我它可以接受 qrc url。所以我就把qml里的所有文件都加进去,就像上面描述的问题一样。但是我仍然看不到任何 GUI。
经过几天的思考。我发现我发布的有问题的图片没有 qmldir 文件!那是 Qt Creator 的一个错误。我使用 Add Existing Directory...
添加文件并将过滤器设置为 *,它仍然不能包含 qmldir 文件。所以我通过xml代码将它添加到qrc文件中。
当我认为这次它一定会起作用时,它却什么也没给我。就在我准备放弃的时候,一个念头冒了出来:检查qrc:/import/qtquick/
是否有效不会浪费我更多的时间。
结果是false
,肯定是我的qrc用法有误。我更改前缀并使用 Qt Creator 保存 qrc。我发现 qrc 文件不能使用 D:/Qt/Qt-5.5-static/qml/Qt/labs/folderlistmodel/plugins.qmltypes
这样的路径,它被 Qt Creator 更改为 Qt/labs/folderlistmodel/plugins.qmltypes
。此时,一切正常!
感谢您阅读我的故事。以下是解决此问题的步骤总结:
.lib
文件之外的所有文件的相对路径和.prl
文件。.qrc
文件并将其包含在.pro
文件中。将所有文件包含到此 .qrc
文件中。我写了一个小程序来生成 xml。QQmlApplicationEngine
的addImportPath
方法添加导入路径。关于qt - 如何为 qtquick 插件添加 qrc 导入路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877311/
此代码成功: QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 此代码打印“失败”:
我想从我的 qrc 文件中获取所有图像并将它们传递给 ComboBox。 不知道再说什么。我认为这是一项非常基本的任务,但我找不到解决方案。 最佳答案 这应该让你走上正轨: foreach( cons
我有几个主题文件夹,每个文件夹都包含一个 .qrc 文件: redTheme/ - File.qml - qml.qrc blueTheme/
我已经在 QRC 资源中添加了一个 jpg 文件,这样就不会每次都拖动图像文件的完整路径。 但是,当我启动应该加载它的用户界面时,它没有显示!! 我给它加了一个别名。它不工作。但是当我写项目解决方案中
我正在用 Qt 4.5 开发一个 C++ 程序,我想用几个资源路径配置我的资源文件 (.qrc)。为此,我想添加一些子路径,但如果我尝试在另一个子路径下添加一个,它似乎不起作用。有人知道这是否可能吗?
对于我的项目,我在 .qrc 文件中有像素图。我可以看到 qrc 生成的头文件包含我的像素图的名称,它们肯定被编译成二进制文件。但是,图片没有加载(它们在 GUI 中是空的),下面的代码 QDirIt
我想知道如何将嵌入到应用程序 qrc 中的文件复制到 fs 中?类似的东西 QFile::copy("qrc:/assets/files/my.file" , "C:/my.file"); 好像不行。
我想在 QLabel 小部件中显示图像。图像位于文件夹 ./images/ 中,相对于 resource.qrc 文件,包含如下: image.png 现在我想
我正在尝试使用 QML-material library在 Qt Quick 应用程序中。 但是当我尝试使用导入代码时,它说 module "Material" is not installed` i
是否可以像使用 QT .Pro 文件那样在 QRC 文件中包含平台部分? (例如 macx、win32 等) 我想知道是否可以将 Mac、Windows、Linux 特定资源拆分为 QRC 文件本身的
我对 Qt 非常陌生。在我的程序中,我在 .qrc 资源文件中添加了一些图标文件。 我们如何在程序中列出 qrc 中存储的文件? 最佳答案 这是应该执行此操作的示例代码: QDirIterator i
我有一个 Qt5 桌面项目,并使用 Qt Creator 编辑器添加了一个“resource.qrc”文件,该文件在项目的 .pro 文件中创建了以下行: RESOURCES = resource.q
我在 Mac 上开发,我在 QRC 路径上没有问题,在切换到 Windows 后,图像链接停止工作。但是 qss 文件可以被引用并且正在工作! 1) 我从头开始创建了一个新的资源文件 2) 我重建了项
我在使用 pyqt 时遇到了一些问题。我必须示例文件: 登录.ui 登录.qrc 因此,使用qt 设计器制作的login.ui 使用了qrc 文件的一些资源。qrc 有一些在 ui 文件中创建的按钮的
我在导入资源文件时遇到问题。我在 monkey studio 中使用 pyqt4,我正在尝试导入 png 图像。当我运行该程序时,出现类似 的导入错误 ImportError: No module n
我有一个 Qt5 桌面项目,并使用 Qt Creator 编辑器添加了一个“resource.qrc”文件,该编辑器在项目的 .pro 文件中创建了以下行: RESOURCES = resource.
我已经构建了一个静态 Qt 库,并希望使用它通过独立的 exe 部署我的应用程序。经过一天的努力,我知道qtquick插件不能静态包含到exe中。 我需要将qml文件夹中的一些文件夹复制到我的exe目
我正在使用带有 QT Visual Studio 集成的 Visual Studio 2005 IDE。 QT 版本是 4.7.3。 我有一个项目,其中包含在 QT 资源集合文件 (.qrc) 中定义
我的系统上运行着下面的项目: How to Create QRCode using Java 但我无法弄清楚如何使用这个库设置纠错级别。 最佳答案 来自QRGen documentation ,你不能
如何在 Visual Studio 2015 中的每个版本中强制对 qrc 文件进行 rcc-ing?我们将资源嵌入二进制文件中,因此如果 qml 或图像 Assets 等内容发生变化,我们需要运行
我是一名优秀的程序员,十分优秀!