Qt quick 与 C++通信(三)Q_INVOKE
通过Q_INVOKE双向改变qml显示的字符
.message.h
#ifndef MESSAGE_H
#define MESSAGE_H
#include <QObject>
#include <QQuickItem>
class Message : public QObject
{
Q_OBJECT
Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged)
public:
explicit Message(QObject *parent = 0);
QString message() const {return m_message;}
void setMessage(QString value);
Q_INVOKABLE int sendMessageFromCpp(const QString value);
public slots:
void doMessageChange();
signals:
void messageChanged();
private:
int m_counter;
QString m_message;
explicit Message(const Message & rhs) = delete;
Message& operator = (const Message& rhs) = delete;
};
#endif // MESSAGE_H
message.cpp
#include "message.h"
#include <iostream>
#include <QDebug>
Message::Message(QObject *parent):
QObject (parent),
m_counter(0),
m_message("Startup Message")
{
}
void Message::setMessage(QString value)
{
m_message = value.arg(++m_counter);
emit messageChanged();
}
int Message::sendMessageFromCpp(const QString value)
{
qDebug() << "This is C++ speaking. I heard QML say:"<<value;
return m_counter;
}
void Message::doMessageChange()
{
setMessage("Hello Property World %1");
// ++m_counter;
// emit messageChanged(m_message.arg(m_counter));
}
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Component.onCompleted:
{
messageClasee.message = "Changed from QML"
}
// Connections{
// target:messageClasee
// onMessageChanged: textId.text = value;
// }
Column{
Text {
id :textId
text: messageClasee.message
font.pointSize: 20
}
Button{
text:"Change Text"
onClicked: messageClasee.doMessageChange()
}
Button{
text:"Talk to C++"
onClicked: {
var result = messageClasee.sendMessageFromCpp("This is QML saying hi");
print("QML Received" + result)
}
}
}
}