CMake设置-DCMAKE_PREFIX_PATH=C:\Qt\6.6.2\msvc2019_64
demo工程结构:
├───CMakeLists.txt
└───main.cpp
└───Main.qml
└───MyObject.cpp
└───MyObject.h
└───MyRectangle.qml
CMakeLists.txt
cmake_minimum_required(VERSION 3.16)project(qmltest02 VERSION 0.1 LANGUAGES CXX)set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)qt_standard_project_setup(REQUIRES 6.5)qt_add_executable(appqmltest02main.cppMyObject.cppMyObject.h
)qt_add_qml_module(appqmltest02URI qmltest02VERSION 1.0QML_FILES Main.qmlQML_FILES MyRectangle.qml
)# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
set_target_properties(appqmltest02 PROPERTIES
# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appqmltest02MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}MACOSX_BUNDLE TRUEWIN32_EXECUTABLE TRUE
)target_link_libraries(appqmltest02PRIVATE Qt6::Quick
)include(GNUInstallDirs)
install(TARGETS appqmltest02BUNDLE DESTINATION .LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "MyObject.h"int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;/* 将自定义 C++ 类型注册到 QML 中的函数*/// 参数: 导入的模块名(约等于头文件), 主版本号,次版本号,组件名(约等于类名)qmlRegisterType<MyObject>("MyObj", 1, 0, "MyObject");QObject::connect(&engine,&QQmlApplicationEngine::objectCreationFailed,&app,[]() { QCoreApplication::exit(-1); },Qt::QueuedConnection);engine.loadFromModule("qmltest02", "Main");return app.exec();
}
Main.qml
import QtQuick
import MyObj 1.0
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello qml")MyObject {// 约等于组件对象名(class变量对象名)id: myobjstr: "hahahah"value: 10// 约等于构造函数Component.onCompleted: {console.log(value, str)}}// 列布局Column {// 行布局Row {spacing: 2Rectangle {id: r1color: "red"height: 100width: 200}MyRectangle {x: r1.width + 20}Text {id: text01text: qsTr("text")font.pixelSize: 30}}Button {id: btn1width: 50height: 50text: "btn1"// 自定义属性并赋值property string tx: myobj.stronClicked: {console.log("btn1 被点击")text01.text = tx + myobj.valuemyobj.func();}}}
}
MyRectangle.qml
import QtQuickRectangle {id: r2property int aa: 1color: "blue"height: 100width: 200
}
MyObject.h
//
// Created by Dark on 24-4-28.
//#pragma once#include <QObject>class MyObject : public QObject
{Q_OBJECTpublic:explicit MyObject(QObject *parent = nullptr);int value() const;void setValue(int newValue);QString str() const;void setStr(const QString &newStr);// 声明Q_INVOKABLE, 可以让func给qml调用Q_INVOKABLE void func();signals:void valueChanged();void strChanged();private:int m_value;QString m_str;Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged FINAL)Q_PROPERTY(QString str READ str WRITE setStr NOTIFY strChanged FINAL)
};
MyObject.cpp
//
// Created by Dark on 24-4-28.
//#include "MyObject.h"#include <QDebug>MyObject::MyObject(QObject *parent) : QObject(parent) {}int MyObject::value() const
{return m_value;
}void MyObject::setValue(int newValue)
{if (m_value == newValue)return;m_value = newValue;emit valueChanged();
}QString MyObject::str() const
{return m_str;
}void MyObject::setStr(const QString &newStr)
{if (m_str == newStr)return;m_str = newStr;emit strChanged();
}void MyObject::func()
{qDebug() << "MyObject::func";m_value += 10;
}
编译后,执行windeployqt把需要的dll拷贝到exe的目录,运行
运行结果: