【问题标题】:Integrating C++ class from subfolder in QML从 QML 中的子文件夹集成 C++ 类
【发布时间】:2021-11-16 22:54:01
【问题描述】:

我目前正在研究与 QML 的 c++ 集成,到目前为止一切正常。我让我的后端类暴露并工作。现在我扩展了我的应用程序,我想将我的 c++ 后端拆分为子文件夹,以便更好地了解项目。现在我遇到了无法再找到这些子文件夹中的后端文件的链接问题。由于我正在使用一些需要特定编译器的库,因此我使用的是 MSVC 16,它会引发以下错误:

Cannot open include file: 'loginstate.h': No such file or directory. 

解析工作正常,QtCreator 不会将包含标记为错误。

在构建时,它会创建一个名为 application.metatypes.json 的文件。在所述文件中,存储了有关公开类的所有信息。通读它时,我发现 loginstates.h 应该在根目录中,而实际上它不在根目录中,它位于根目录的子文件夹中。当我手动将其更改为正确的文件夹时,我的应用程序就会运行。

有没有办法让 qmake/moc 为子文件夹中的类生成正确的路径?我缺少什么设置?

.pro 文件:

QT = core quick serialport network virtualkeyboard

TEMPLATE = app

CONFIG += qt c++17 warn_on qmltypes
CONFIG -= debug_and_release debug_and_release_target

SOURCES += \
    main.cpp \
    datetimebackend.cpp \
    footerbackend.cpp \
    labelbuttonbackend.cpp \
    globaluisettings.cpp \
    headerbackend.cpp \
    scannerbuttonbackend.cpp \
    sidebarbackend.cpp

HEADERS += \
    businessLogic/loginstate.h \
    datetimebackend.h \
    footerbackend.h \
    globaluisettings.h \
    headerbackend.h \
    labelbuttonbackend.h \
    scannerbuttonbackend.h \
    sidebarbackend.h

RESOURCES += qml.qrc

RC_ICONS = ./images/icon.ico

INCLUDEPATH += $$PWD/..

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH += $$PWD

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

QML_IMPORT_NAME = Backend
QML_IMPORT_MAJOR_VERSION = 1

DISTFILES += some qml files

【问题讨论】:

  • 它只是“无法打开包含文件”,与QML无关。意识到如何使用 INCLUDEPATH 中的头文件来引用该目录,现在有什么 ($PWD) 不是通常要做的事情。最好使用 CMAKE 快捷方式:stackoverflow.com/questions/15392561/cmake-include-path,并且您创建的每个目录都包含从某个根目录列出的包含。
  • 我正在使用 qmake 来生成我的 makefile,所以我无法直接访问它是如何完成的。该包含的目的是将我的 subdir 项目的所有子项目包含到我的主应用程序中 - 这也是一个子项目。它使#include 语句看起来更干净

标签: c++ qt qmake


【解决方案1】:

你得到这些错误只是因为一些头文件不在路径中并且编译器找不到它们。正如您所说,您重组了目录模板,您只需在 .pro 文件中添加适当的包含路径到 INCLUDEPATH 参数,如:

INCLUDEPATH += $$PWD/new/include/path

对每个包含编译器未找到的.h 文件的目录执行此操作。

【讨论】:

  • 这是有效的。谢谢!我只是想知道为什么我突然需要为 QML 集成类而不是我的常规 c++ 类这样做?
  • @Tanzmaus,可能以它们仍在路径中的方式引用它们(例如相对 #include 或同一目录包括。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多