为 QML-Usage 返回 QString

returning QString for QML-Usage

idk 为什么,但我无法从 .qml-code 中的 .cpp-code 中读取 return 方法的 return 值,尽管我所做的一切在逻辑上都是正确的(我会只放代码的相关部分):

.h 文件:

public:
    Q_INVOKABLE QString displayOnQml();
    QString message;
public slots:
   void updateMessage(const QMqttMessage &msg);

.cpp 文件:

connect(m_sub, &QMqttSubscription::messageReceived, this, &mqtt::updateMessage);
connect(m_sub, &QMqttSubscription::messageReceived, this, &mqtt::displayOnQml);
void mqtt::updateMessage(const QMqttMessage &msg)
{
    message=msg.payload();
    qDebug()<<message;
}
QString mqtt::displayOnQml()
{
    return message;
}

.qml 文件

  Text {
     id: text1
     x: 63
     y: 68
     text: mqttClient.displayOnQml()
     font.pixelSize: 12
  }

(我将 .cpp-Methodes 作为 engine.rootContext()->setContextProperty("mqttClient",mqttClient); 嵌入到 .qml 中,这样我也可以使用其他函数。)

最后的问题是:为什么通过调试我在 displayOnQml() 上捕获了 .cpp-File 中的断点(当我向主题发送一些数据时),但毕竟对象 message 没有“值”,尽管它是作为 public 声明的?而且,来自 .cpp-Methodes 的简单 returns(例如 1 或 0)仍在工作..

Q_INVOKABLE 不会创建绑定,因为您不知道字符串何时更改。在这种情况下,最好创建一个 Q_PROPERTY:

*.cpp

class mqtt: ...{
    Q_OBJECT
    // ...
    Q_PROPERTY(QString message READ message NOTIFY messageChanged)
public:
    // ...
    QString message() const;
    // ...
Q_SIGNALS:
    void messageChanged();
    // ...
private:
    QString m_message;
    // ...
};

*.h

void mqtt::updateMessage(const QMqttMessage &msg)
{
    m_message = msg.payload();
    Q_EMIT messageChanged();
}
QString mqtt::message() const{
    return m_message;
}
Text {
    id: text1
    x: 63
    y: 68
    text: mqttClient.message
    font.pixelSize: 12
}