我有一個像這樣在 QML 中使用的QObject派生類。Expense
// 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
我已經用于在 QMLqmlRegisterType()中注冊型別。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。在檔案中,我看到我們可以使用qt_add_qml_moduleCMakeList.txt 中的命令來注冊 C 類qmlRegisterType(),而不是通過將QML_ELEMENT宏添加到 QObject 類。
但我不明白如何做到這一點,檔案沒有意義,因為它使用 qmake 示例(鏈接到檔案)而不是 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,而不是我的完整代碼。
uj5u.com熱心網友回復:
您只需要添加QML_ELEMENT到 QObject 派生Expense類的標頭并確保在 CMakeLists.txt 中啟用了 moc。在應用案例中,expense.h/cpp 源是否通過qt_add_executable或包含在內都沒有關系qt_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)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429953.html
