gpt4 book ai didi

c++ - 如何使用 qt_add_qml_module 在 CMake 中注册 QObject 类?

转载 作者:行者123 更新时间:2023-12-05 01:53:09 30 4
gpt4 key购买 nike

我有一个 QObject 派生类 Expense,我在 QML 中使用它,就像这样。

// main.qml
Expense {
id: expenseManager
onExpenseCreated: {
// Do something
}
}

费用类没有 UI 组件,它有一些用于 API 通信的基本信号和插槽。

// expense.h

#ifndef EXPENSE_H
#define EXPENSE_H
#include <QObject>
#include <QString>

#include "service.h"

class Expense : public QObject
{
Q_OBJECT

private:
Service service;
void networkError();
bool buttonLock = false;

public:
explicit Expense(QObject *parent = nullptr);


public slots:
void createInvoice(QString item, float amount);

signals:
void expenseCreated();

};

#endif // EXPENSE_H

我使用 qmlRegisterType() 在 QML 中注册 Expense 类型。下面是我的 main() 的样子。

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
......


qmlRegisterType<Expense>("com.kadbyte.expense", 1, 0, "Expense");

........
return app.exec();
}

一切都像以前一样完美运行。但最近我将我的项目升级到 QT6,使用 CMake 作为构建工具而不是 QMake。在文档中我看到我们可以在 CMakeList.txt 中使用 qt_add_qml_module 命令来注册 C++ 类而不是 qmlRegisterType(),方法是添加 QML_ELEMENT 宏到 QObject 类。

但我不明白该怎么做,文档没有意义,因为它使用 qmake 示例 ( Link to docs ) 而不是 CMake。下面是我的 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.16)

project(Udyan VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 6.2 COMPONENTS Quick REQUIRED)

qt_add_executable(appUdyan
main.cpp
expense.h expense.cpp
)

qt_add_qml_module(appUdyan
URI Udyan
VERSION 1.0
QML_FILES qml/main.qml
)

set_target_properties(appUdyan PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)

target_compile_definitions(appUdyan
PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)

target_link_libraries(appUdyan
PRIVATE Qt6::Quick)

那么如何使用qt_add_qml_module注册QObject类在QML中使用呢?

注意:我上面给出的所有例子只是一个MRE,并不是我的完整代码。

最佳答案

您只需将 QML_ELEMENT 添加到您的 QObject 派生 Expense 类的 header 中,并确保您在 CMakeLists.txt 中启用了 moc。在应用案例中,expense.h/cpp 源是否通过 qt_add_executableqt_add_qml_module 包含并不重要。我认为将它们添加到 qt_add_qml_module SOURCES 中会更清楚。然后你只需在你的 QML 文件中导入模块 URI。在下面的示例中,我在 QML 中打印出 Expense 对象的属性值。

CMakeLists.txt

set(CMAKE_AUTOMOC ON)

qt_add_qml_module(appUdyan
URI udyan
VERSION 1.0
QML_FILES
main.qml
SOURCES
expense.h
expense.cpp
)

C++

#include <QObject>
#include <QtQml/qqmlregistration.h>

class Expense : public QObject
{
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(int value READ value NOTIFY valueChanged)
public:
explicit Expense(QObject *parent = nullptr);
int value() const;

signals:
void valueChanged();

private:
int m_value {5};
};

QML:

import QtQuick
import udyan

Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")

Expense {
id: expense
Component.onCompleted: console.log(expense.value)
}
}

关于c++ - 如何使用 qt_add_qml_module 在 CMake 中注册 QObject 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71182775/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com