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