Vipr0
Vipr0

Reputation: 59

Unknown type name QML_ELEMENT and QML module can't be found even though copied straight from a official example

When I want to run this example of Integrating QML and C++ I get a error (in the backend.h) that QML_ELEMENT is not a defined type. I know that a similar question was asked here already, however since I copy pasted from the official example, I did #include <qqml.h>. That means the cause of my error has to be a different one.
In addition importing io.qt.examples.backend 1.0 gives me a error, that this QML module can not be found. I use Qt 5.9 and Qt Quick Application.

The content of my backend.cpp, backend.h and main.qml are copy pasted from the example, so I won't repost them. My project file is just the default one with the additions from the example:

QT += quick

CONFIG += c++11 qmltypes

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
# deprecated API to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        backend.cpp \
        main.cpp

RESOURCES += qml.qrc

QML_IMPORT_NAME = io.qt.examples.backend
QML_IMPORT_MAJOR_VERSION = 1

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

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

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

HEADERS += \
    backend.h

Upvotes: 3

Views: 3024

Answers (2)

comp1201
comp1201

Reputation: 415

I was having the same issue you described in Qt 5.15. The following fixed the problem for me: In the project directory on disk, find the .qmltypes file that is automatically generated by Qt and add that file to the debug folder (also automatically created by Qt). This will make the red error messages in Qt Creator go away. In this blog post, it is mentioned that

Such static registration of C++ types for QML will not only generate qmltypes files for plugins, but also for your main application. The latter files are called "app.qmltypes" and should be placed next to your application binary, the same way "plugins.qmltypes" should be placed next to the plugin they refer to.

So its just an issue of making sure that the .qmltypes file is in the correct place (next to the application binary).

Upvotes: 0

eyllanesc
eyllanesc

Reputation: 244282

QML_ELEMENT is available from Qt >= 5.15, as you are using Qt 5.9 then you must use qmlRegisterType<BackEnd>("io.qt.examples.backend", 1, 0, "BackEnd"); as points out for Qt 5.9 docs

Upvotes: 6

Related Questions