【问题标题】:QML Svg in qt 5.15 static build, using CMakeqt 5.15 静态构建中的 QML Svg,使用 CMake
【发布时间】:2020-10-14 11:01:12
【问题描述】:

我想从 5.9 迁移到 5.15,但无法从 QML 加载 svg。 使用 Ubuntu (5.9) 提供的 qt 的原始版本确实从 QML 加载了 svg 没有额外的步骤。新版本使用静态 Qt。

我用:

  • Ubuntu 18
  • 在 Qt 5.15 的内部静态构建中
  • CMake (3.18)

构建 Qt

 ./configure \
    -confirm-license \
    -release \
    -static \
    -no-pch \
    -nomake tests \
    -nomake examples \
    -nomake tools \
    -nomake examples \
    -nomake tests \
    -skip qtdoc \
    -skip wayland \
    -skip qtwebengine \
    --prefix=/opt/Qt-5.15.0

CMake

cmake_minimum_required(VERSION 3.18)
project(test VERSION 0.0.0 LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt5 5.15 
    PATHS /opt/Qt-5.15.0
    COMPONENTS
        Core
        Widgets
        Qml
        Svg
        Quick
        QuickControls2
        Charts
        Multimedia
        LinguistTools
        QmlImportScanner 
        Xml
    REQUIRED QUIET
)

add_executable(test_qt

    # c++ code files
    main.cpp

    # qml code files
    qml/Main.qml

    # resource files
    qml/resources.qrc
)

target_include_directories(test_qt PRIVATE ${CMAKE_CURRENT_LIST_DIR})

target_link_libraries(test_qt 
    PRIVATE
        Qt5::Widgets
        Qt5::Qml
        Qt5::Quick
        Qt5::QuickControls2
        Qt5::Svg
        Qt5::Xml
        Qt5::Gui
)

qt_import_qml_plugins(test_qt
    INCLUDE 
        Qt5::QtQuick2Plugin
        Qt5::QSvgPlugin
        Qt5::QtQuickControls2Plugin
)

ma​​in.cpp

#include <QGuiApplication>
#include <QObject>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QQmlContext>

int main(int argc, char *argv[]) {
    int status = 0;

    try {

        QGuiApplication       app(argc, argv);
        QQmlApplicationEngine engine;

        engine.load(QUrl("qrc:/Main.qml"));

        QObject::connect(&engine, &QQmlApplicationEngine::quit, &QGuiApplication::quit);

        if (engine.rootObjects().isEmpty())
            return -1;

        status = app.exec();

    } catch (std::exception &) {
        return -1;
    }

    return status;
}

Main.qml

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    id: window
    width: 850
    height: 850
    visible: true
    color: "lightgray"

    Image{
        source: "image.svg"
    }
}

我省略了资源文件,但它列出了 qml、png 和 svg 文件。 使用PNG图片时加载成功,但使用SVG时出现如下错误: qrc:/Main.qml:13:5: QML Image: Error decoding: qrc:/image.svg: Unsupported image format

当前的 Qt 版本包含以下与 SVG 处理相关的文件:

./lib/libQt5Svg.a
./lib/libQt5Svg.la
./lib/cmake/Qt5Svg
./lib/cmake/Qt5Svg/Qt5SvgConfigVersion.cmake
./lib/cmake/Qt5Svg/Qt5SvgConfig.cmake
./lib/cmake/Qt5Gui/Qt5Gui_QSvgIconPlugin.cmake
./lib/cmake/Qt5Gui/Qt5Gui_QSvgPlugin_Import.cpp
./lib/cmake/Qt5Gui/Qt5Gui_QSvgIconPlugin_Import.cpp
./lib/cmake/Qt5Gui/Qt5Gui_QSvgPlugin.cmake
./lib/pkgconfig/Qt5Svg.pc
./lib/libQt5Svg.prl
./include/QtSvg
./include/QtSvg/QGraphicsSvgItem
./include/QtSvg/5.15.0/QtSvg
./include/QtSvg/QSvgRenderer
./include/QtSvg/QSvgWidget
./include/QtSvg/QSvgGenerator
./include/QtSvg/QtSvg
./include/QtSvg/QtSvgVersion
./include/QtSvg/QtSvgDepends

编辑

我在 find_package 命令中添加了缺少的 Svg 库依赖项。问题仍未解决。

如果我链接到 Qt 库的共享构建,则该项目可以正常工作。

【问题讨论】:

    标签: qt svg cmake


    【解决方案1】:

    我的解决方案是在 find_package 和 target_link_libraries 中包含 Qt5::Svg,例如:

    find_package(Qt5 REQUIRED COMPONENTS Core Quick Qml Xml Charts Gui Svg QuickControls2)
    target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Quick Qt5::Qml Qt5::Xml Qt5::Charts Qt5::Gui Qt5::Svg Qt5::QuickControls2)
    

    在静态链接 Qt 5.15 时还包括以下内容:

    qt5_import_plugins(${PROJECT_NAME} INCLUDE Qt5::QSvgPlugin)
    

    解决了诸如“QML ButtonIcon:错误解码:qrc:/resources/images/add-white-36dp.svg:不支持的图像格式”之类的错误

    【讨论】:

      【解决方案2】:

      您正在使用 cmake,但在 qmake .pro 项目中,使用静态链接,您 必须加

      QT += svg

      请注意,svg 插件依赖于小部件:

      “QT += svg”与“QT += svg widgets”相同

      在 android/IOS 中最好跳过 svg 图片以减小应用大小。

      /opt/Qt/5.15.1/gcc_64/lib$ ldd libQt5Svg.so
          linux-vdso.so.1 (0x00007fff7bff0000)
          libQt5Widgets.so.5 => /opt/Qt/5.15.1/gcc_64/lib/./libQt5Widgets.so.5 (0x00007ff0cbf55000)
          libQt5Gui.so.5 => /opt/Qt/5.15.1/gcc_64/lib/./libQt5Gui.so.5 (0x00007ff0cb624000)
      

      您可以尝试在 main.cpp 中添加一些 C++ QTSVG 代码来测试链接

      https://doc.qt.io/qt-5/qsvggenerator.html

      【讨论】:

      • 感谢您的宝贵时间,但我特意询问了针对此问题的 CMake 解决方案。
      • 是的,但是我在静态 win32 Qt 构建中遇到了这个问题。同样的错误,用 QT += svg 解决。我认为你必须在 find_package 函数中添加“Svg”:find_package(Qt5 5.15 PATHS /opt/Qt-5.15.0 COMPONENTS Core Widgets Qml Quick QuickControls2 Charts Multimedia LinguistTools QmlImportScanner Xml Svg REQUIRED QUIET)
      • 我更新了代码,正如你提到的,在 find_package 命令中缺少 Svg。然而,该程序正在链接 Qt5::Svg(这意味着该库已找到并使用)。
      • 我认为 cmake 没有生成导入插件代码:doc.qt.io/archives/qt-5.9-devicecreation/…。尝试添加到 main.cpp #include 和 Q_IMPORT_PLUGIN(QSvgIconPlugin); Q_IMPORT_PLUGIN(QSvgPlugin);主函数内部
      • 感谢 Miguel,我也确实尝试过这条路。当不在代码或 cmake 中声明插件时。该应用程序不会加载,并会让我知道插件丢失。你知道我是否必须在 cmake 和 c++ 中声明插件吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2022-07-15
      相关资源
      最近更新 更多