Qt 小例子学习19 - C++传输数据给QML显示

本文介绍了如何使用C++的Data类通过Runnable实现数据更新,并实时同步到QML中的Text组件。通过QMetaObject::invokeMethod调用,展示了跨C++与QML的信号槽通信机制。
摘要由CSDN通过智能技术生成

Qt 小例子学习19 - C++传输数据给QML显示

data.h

#ifndef DATA_H
#define DATA_H

#include "runnable.h"

#include <QObject>
#include <QThreadPool>

class Data : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int number READ number WRITE setNumber NOTIFY numberChanged)
public:
    explicit Data(QObject *parent = nullptr) : QObject(parent)
    {
        m_number = 0;
        runnable = new Runnable(this);
    }
    ~Data() { runnable->stop(); }
    Q_INVOKABLE void start()
    {
        if (!runnable->isRunning())
            QThreadPool::globalInstance()->start(runnable);
    }
    int number() const { return m_number; }
public slots:
    void setNumber(int number)
    {
        if (number == m_number)
            return;
        m_number = number;
        emit numberChanged(m_number);
    }
signals:
    void numberChanged(int);

private:
    int m_number;
    Runnable *runnable;
};

#endif // DATA_H

main.cpp

#include "data.h"

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qmlRegisterType<Data>("com.example.data", 1, 0, "Data");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

main.qml

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Layouts 1.3
import QtQuick.Controls 1.4

import com.example.data 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Example")

    ColumnLayout {
        anchors.centerIn: parent
        Button {
            id: button
            Layout.fillWidth: true
            text: "start"
            onClicked: data.start()
        }

        Text {
            id: text1
            text: data.number
            horizontalAlignment: Text.AlignHCenter
            Layout.fillWidth: true
        }
    }

    Data{
        id: data
    }
}

runnable.h

#ifndef RUNNABLE_H
#define RUNNABLE_H

#include <QObject>
#include <QRunnable>
#include <QThread>

class Runnable : public QRunnable
{
    int mNumber = 0;
    QObject *mReceiver;
    bool mRunning;

public:
    Runnable(QObject *receiver)
    {
        mReceiver = receiver;
        mRunning = false;
    }
    void run()
    {
        mRunning = true;
        while (mRunning)
        {
            mNumber++;
            QMetaObject::invokeMethod(mReceiver, "setNumber", Qt::QueuedConnection,
                                      Q_ARG(int, mNumber));
            QThread::msleep(10);
        }
    }
    bool isRunning() const { return mRunning; }
    void stop() { mRunning = false; }
};

#endif // RUNNABLE_H

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值