首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QML在QT5.15静态构建中使用CMake

QML在QT5.15静态构建中使用CMake
EN

Stack Overflow用户
提问于 2020-10-14 11:01:12
回答 2查看 1.2K关注 0票数 4

我想从5.9迁移到5.15,我不能从QML加载svg。使用Ubuntu (5.9)提供的qt的原始版本没有额外的步骤就从QML加载svg。新构建使用静态Qt。

我用:

  • Ubuntu 18
  • 在Qt 5.15
  • CMake (3.18)

中的静态构建

构建Qt

代码语言:javascript
运行
复制
 ./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

代码语言:javascript
运行
复制
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
)

main.cpp

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
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处理相关的以下文件:

代码语言:javascript
运行
复制
./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

编辑

我将缺失的Svg库依赖项添加到find_package命令中。这个问题仍未解决。

如果我链接到Qt库的共享构建,这个项目就能正常工作。

EN

回答 2

Stack Overflow用户

发布于 2021-12-03 17:09:14

我的解决方案除了在find_package和target_link_libraries中包括Qt5::Svg之外,例如:

代码语言:javascript
运行
复制
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)

在静态链接QT5.15时还包括以下内容:

代码语言:javascript
运行
复制
qt5_import_plugins(${PROJECT_NAME} INCLUDE Qt5::QSvgPlugin)

解决了诸如"QML ButtonIcon:错误解码:qrc:/resources/映像/add 36dp.svg:不支持的图像格式“等错误。

票数 1
EN

Stack Overflow用户

发布于 2020-10-14 13:22:46

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

QT += svg

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

"QT += svg“与"QT += svg小部件”相同。

在android/IOS中,最好跳过svg图像以缩小应用程序的大小。

代码语言:javascript
运行
复制
/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)

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64351873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档