qml与c++信号槽的交互

qml接收c++信号

在qml代码中接收信号时,不需要再写槽函数,直接在目标信号前加on即可。如发送过来的信号为nameChanged(const QString &name),则在qml中这样写即可:

// 针对于类名中
TestData {     // qmlRegisterType注册的类名
        id: testData;
        onNameChanged: {
        // 需要执行的操作
        console.log("Received the signal: " + name);
    }
}
// 针对于实例化后的对象
Connections {
        target: testData
        onNameChanged: {
        // 需要执行的操作
        console.log("Received the signal: " + name)
    }
}

 

示例代码如下:

#include <QObject>
#include <QDateTime>

class testObject : public QObject
{
    Q_OBJECT
    // 注册属性,通过Q_PROPERTY注册到元对象系统
    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
public:
    testObject(QObject *parent = Q_NULLPTR)
    {

    };
    ~testObject() { };

    void setName(const QString &name)
    {
        m_name = name;
        emit nameChanged(name);
    }

    QString getName()
    {
        return m_name;
    }

signals:
    void nameChanged(const QString name);

private:
    QString m_name = "Initial Text";
};
#include "widget.h"
#include "ui_widget.h"
#include "testObject.h"

#include <QQmlContext>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    qmlRegisterType<testObject>("com.qt.testcomponent", 1, 0, "TestData");

    ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
    ui->quickWidget->setSource(QUrl("qrc:/main.qml"));
}

Widget::~Widget()
{
    delete ui;
}
import QtQuick 2.9

import com.qt.testcomponent 1.0

Item {
    visible: true
    width: 640
    height: 480

    Rectangle {
        id: bg1;
        width: parent.width;
        height: 50;
        radius: height / 8;
        color: "blue";
        anchors.top: parent.top;

        Text {
            id: namer;
            text: testData.name;
            font.pixelSize: 30
            anchors.centerIn: bg1;
        }

        MouseArea {
            anchors.fill: parent
            acceptedButtons: Qt.LeftButton | Qt.RightButton
            onClicked: {
                if(mouse.button === Qt.LeftButton){
                    testData.name = "Mouse Clicked!";
                    console.log(testData.name);
                }
            }
        }
        // 针对于实例化后的对象
        Connections {
            target: testData
            onNameChanged: {
                console.log("Received the signal: " + name)
            }
        }
    }

    // 针对于类名中
    TestData {
        id: testData;
        onNameChanged: {
            console.log("Received the signal: " + name);
        }
    }
}

 

 

c++接收qml信号

(testObject.h并未改变,参照上文即可)

#include "widget.h"
#include "ui_widget.h"
#include "testObject.h"

#include <QQmlContext>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    qmlRegisterType<testObject>("com.qt.testcomponent", 1, 0, "TestData");

    ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
    ui->quickWidget->setSource(QUrl("qrc:/main.qml"));
    // QML使用arg()函数扩展了JavaScript String类型,以支持值替换;
    // 与C++集成时,从C++传递到QML的任何QString值都会自动转换为string,反之亦然;
    connect((QObject*)ui->quickWidget->rootObject(), SIGNAL(qmlSignal(QString)), this, SLOT(recQmlSignal(QString)));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::recQmlSignal(QString text)
{
    qDebug() << "Received the qml signal: " + text << endl;
}
import QtQuick 2.9

import com.qt.testcomponent 1.0

Item {
    visible: true
    width: 640
    height: 480

    signal qmlSignal(string text)

    Rectangle {
        id: bg1;
        width: parent.width;
        height: 50;
        radius: height / 8;
        color: "blue";
        anchors.top: parent.top;

        Text {
            id: namer;
            text: testData.name;
            font.pixelSize: 30
            anchors.centerIn: bg1;
        }

        MouseArea {
            anchors.fill: parent
            acceptedButtons: Qt.LeftButton | Qt.RightButton
            onClicked: {
                if(mouse.button === Qt.LeftButton){
                    testData.name = "Mouse Clicked!";
                    qmlSignal(testData.name);
                }
            }
        }

    TestData {
        id: testData;
    }
}

 

 

其他

c++调用qml中函数

QMetaObject::invokeMethod((QObject*)ui->quickWidget->rootObject(), "qml中的函数名");

 

qml中的信号触发qml的函数

Component.onCompleted:    // 相当于qml中的构造函数,一般用以初始化
{
    qmlSignal.connect(qmlFunction);
}

 

 

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QMLC++交互的方法主要有以下几种: 1. 使用QObject::connect()函数连接QMLC++对象的信号函数,实现数据的传递和交互。 2. 使用Q_INVOKABLE宏将C++函数声明为可在QML中调用的函数。这样,QML可以直接调用C++函数,实现数据的交互。 3. 使用Q_PROPERTY宏将C++对象的属性声明为可在QML中访问的属性。这样,QML可以直接访问C++对象的属性,实现数据的交互。 4. 使用QQmlContext类将C++对象注册到QML中,并在QML中访问这些对象。这样,QML可以直接访问C++对象,实现数据的交互。 下面是一个具体的例子,展示了如何在QML中访问C++对象的属性和函数。 C++代码: ``` // MyObject.h #include <QObject> class MyObject : public QObject { Q_OBJECT Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged) public: explicit MyObject(QObject *parent = nullptr); int value() const; void setValue(int value); signals: void valueChanged(); private: int m_value; }; // MyObject.cpp #include "MyObject.h" MyObject::MyObject(QObject *parent) : QObject(parent) { m_value = 0; } int MyObject::value() const { return m_value; } void MyObject::setValue(int value) { if (m_value != value) { m_value = value; emit valueChanged(); } } ``` QML代码: ``` import QtQuick 2.0 Item { width: 200 height: 200 Text { text: "Value: " + myObject.value } Slider { anchors.top: text.bottom from: 0 to: 100 value: myObject.value onValueChanged: myObject.value = value } Connections { target: myObject onValueChanged: text.text = "Value: " + value } Component.onCompleted: { console.log("Value:", myObject.value) } } ``` 在这个例子中,我们创建了一个名为MyObject的C++对象,并将其注册到QML中。MyObject类有一个名为value的属性和一个名为setValue的函数,用于设置属性值。在QML中,我们创建一个Slider和一个Text组件,用于显示和修改MyObject的value属性。我们还使用Connections组件将MyObject的valueChanged信号与Text的text属性绑定,以使其能够自动更新。最后,在Component.onCompleted信号处理程序中,我们打印MyObject的value属性的值,以验证其已成功从C++对象传递到QML界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值