第三代软件开发-C++&QML交互
关键字:
Qt
、 Qml
、 C++
、 Q_OBJECT
、 QObject
项目介绍
重要说明☝
☀该专栏在第三代软开发更新完将涨价
C++&QML交互
这里第一次出现了咱们项目的标题了C++&QML,上一篇咱们通过监听用户操作事件,咱们开始了C++与QML 的交互,其实在更早的【第三代软件开发-QCustomPlot核心迁移】已经涉及到了C++&QML的交互了,只是在那片文章中主要讲的是如何将一个C++的绘图对象搞成QML可以渲染的类型,没有过多的介绍C++&QML交互,今天咱们就说道说道。
属性绑定示例
C++中定义一个QObject派生类
class MyObject : public QObject
{
Q_OBJECT
Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)
public:
int getValue() const { return m_value; }
void setValue(int value) {
if (m_value != value) {
m_value = value;
emit valueChanged();
}
}
signals:
void valueChanged();
private:
int m_value;
};
QML中使用并绑定属性
import QtQuick 2.0
Item {
MyObject {
id: myObj
}
Rectangle {
width: myObj.value // 绑定到C++对象的属性
height: myObj.value // 绑定到C++对象的属性
}
}
信号与槽
C++中定义一个QObject派生类
class MyObject : public QObject
{
Q_OBJECT
public slots:
void buttonClicked() {
qDebug() << "Button clicked";
}
};
QML中连接信号与槽
import QtQuick 2.0
Item {
MyObject {
id: myObj
}
Button {
text: "Click me"
onClicked: myObj.buttonClicked() // 连接到C++对象的槽函数
}
}
在QML中调用C++函数
C++中定义一个QObject派生类
class MyObject : public QObject
{
Q_OBJECT
public slots:
void showMessage(const QString& message) {
qDebug() << "Received message:" << message;
}
};
QML中调用C++函数
import QtQuick 2.0
Item {
MyObject {
id: myObj
}
TextField {
id: inputField
}
Button {
text: "Send"
onClicked: myObj.showMessage(inputField.text) // 调用C++函数,并传递参数
}
}
使用上下文共享数据
C++中创建上下文对象并共享数据
QQmlApplicationEngine engine;
MyObject myObj;
engine.rootContext()->setContextProperty("myObject", &myObj);
QML中访问C++对象的属性和函数
import QtQuick 2.0
Item {
property int value: myObject.value // 通过上下文访问C++对象的属性
Button {
text: "Update"
onClicked: {
myObject.value = 100 // 通过上下文修改C++对象的属性值
console.log(myObject.value)
}
}
}
创建可导出的C++对象
C++中定义可导出的QObject派生类
class MyObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString text READ getText WRITE setText NOTIFY textChanged)
public:
QString getText() const { return m_text; }
void setText(const QString& text) {
if (m_text != text) {
m_text = text;
emit textChanged();
}
}
signals:
void textChanged();
private:
QString m_text;
};
QML中使用并连接C++对象的信号与槽
import QtQuick 2.0
MyObject {
id: myObj
}
Rectangle {
width: 200
height: 100
color: "lightblue"
Text {
anchors.centerIn: parent
text: myObj.text // 访问C++对象的属性
Component.onCompleted: {
myObj.textChanged.connect(updateText) // 连接到C++对象的信号
}
}
function updateText() {
console.log("Text changed:", myObj.text)
// 可以执行任何QML中的其他操作
}
}
总结一下
C++&QML交互方式不值一种,也不止这5中,在实际项目中,可以有更多方式,同理,这几种也不是说哪一种最好,还是要根据实际项目需要进行选择,选着最合适的就是最好的。