目錄
一.介紹
二.pro文件添加模塊
三.h文件
四.cpp文件
五.注冊
六.調用
七.展示效果
八.代碼
1.qmlandc.h
2.qmlandc.cpp
3.main.cpp
4.qml
一.介紹
在 Qt 中,QML 與 C++ 交互是非常重要的,因為它允許開發人員充分利用 QML 和 C++ 各自的優勢,實現更加靈活和高效的應用程序開發。
QML 是一種聲明性的語言,用于構建用戶界面,具有直觀、簡潔和易于理解的特點,適合用于描述界面的外觀和交互邏輯。而 C++ 是一種強大的編程語言,可以進行復雜的計算和處理邏輯,適合用于實現底層功能和業務邏輯。
通過 QML 與 C++ 的交互,可以實現以下作用和重要性:
1.性能優化:C++ 可以處理復雜的計算和邏輯,可以提高應用程序的性能。通過將一些計算密集型的任務交給 C++ 處理,可以提高應用程序的響應速度和性能表現。
2.業務邏輯處理:C++ 可以處理底層的業務邏輯,如數據處理、文件操作、網絡通信等。QML 可以專注于界面的呈現和交互邏輯,而將復雜的業務邏輯交給 C++ 處理,可以更好地分離界面和業務邏輯,提高代碼的可維護性和可重用性。
3.跨平臺開發:Qt 支持跨平臺開發,通過 QML 與 C++ 的交互,可以實現跨平臺的應用程序開發。開發人員可以在 QML 中描述界面,同時在 C++ 中處理平臺相關的邏輯,從而實現跨平臺的應用程序開發。
4.靈活性和可擴展性:通過 QML 與 C++ 的交互,可以實現界面與邏輯的分離,使得應用程序結構更加清晰和靈活。開發人員可以根據需求選擇在 QML 中實現界面邏輯,或者在 C++ 中實現復雜的邏輯,從而實現更加靈活和可擴展的應用程序。
總的來說,QML 與 C++ 交互的作用和重要性在于充分發揮各自的優勢,實現界面與邏輯的分離,提高應用程序的性能、可維護性和可擴展性,從而更好地滿足復雜應用程序的開發需求。
二.pro文件添加模塊
.qml模塊
三.h文件
1.首先,繼承自?QObject
?類,是 Qt 框架中所有 QML 對象的基類。
2.其次,定義了一個?Q_PROPERTY
?宏,用于在 QML 中聲明此類的屬性,并提供?READ
、WRITE
?和?NOTIFY
?三個選項。這里定義了一個名為?name
?的屬性,可以在 QML 中通過?name
?訪問,通過?getname
?函數獲取屬性值,通過?setName
?函數設置屬性值,并通過?NameChangedSig
?信號通知 QML 端屬性值的改變。
3.接下來,構造函數?qmlandc()
,可以在此處進行一些初始化工作。
4.然后,定義了一個?setName
?函數,用于在 C++ 端設置?name
?屬性的值,并在函數末尾通過?NameChangedSig
?信號通知 QML 端屬性值的改變。
5.接下來,定義了一個?getname
?函數,用于在 C++ 端獲取?name
?屬性的值。
6.最后,定義了一個?NameChangedSig
?信號,用于在 C++ 端通知 QML 端?name
?屬性值的改變。
四.cpp文件
1.首先,構造函數?qmlandc()
?將?m_name
?屬性初始化為字符串 "美女"。
2.然后,setName
?函數用于設置?m_name
?屬性的值。如果傳入的?name
?參數與當前?m_name
?屬性的值相同,則直接返回,不進行任何操作。否則,將?m_name
?屬性的值設置為傳入的?name
?參數,并通過?qDebug()
?函數輸出當前?m_name
?屬性的值,最后通過?emit
?關鍵字觸發?NameChangedSig
?信號。
3.最后,getname
?函數用于獲取?m_name
?屬性的值,并將其作為?QString
?類型的返回值返回。
五.注冊
六.調用
七.展示效果
初始值調用c++中getname顯示為:美女,
點擊矩形框調用c++中setname為:帥哥。
八.代碼
1.qmlandc.h
#ifndef QMLANDC_H
#define QMLANDC_H#include <QObject>
#include <QDebug>class qmlandc : public QObject
{Q_OBJECTQ_PROPERTY(QString name READ getname WRITE setName NOTIFY NameChangedSig)public:qmlandc();void setName(QString name);QString getname();signals:void NameChangedSig();public slots:private:QString m_name;
};#endif // QMLANDC_H
2.qmlandc.cpp
#include "qmlandc.h"qmlandc::qmlandc()
{m_name = "美女";
}void qmlandc::setName(QString name)
{if(m_name == name){return ;}m_name = name ;qDebug()<<"aaaaaaaa"<<m_name;emit NameChangedSig();
}QString qmlandc::getname()
{return m_name;
}
3.main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlEngine>
#include "qmlandc.h"
int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);//qmlRegisterType注冊c++類型至qml//arg1:import時模塊名//arg2:主版本號//arg3:次版本號//arg4:qml類型名qmlRegisterType<qmlandc>("Qmlqmlandc", 1, 0 ,"Qmlqmlandc");QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}
4.qml
import QtQuick 2.7
import Qmlqmlandc 1.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.4Window {visible: truewidth: 400height: 400Qmlqmlandc{id:_Qmlqmlandc}Rectangle{anchors.fill: parentRectangle{width: 50height: 50border.width: 1border.color: "black"MouseArea{anchors.fill: parentonClicked: {_Qmlqmlandc.name = "帥哥"}}}Text {anchors.right: parent.rightanchors.rightMargin: 100font.pixelSize: 30text: _Qmlqmlandc.name}}}