Изменить текст метки QML из функции C ++ - PullRequest
0 голосов
/ 08 марта 2020

У меня есть метка в QML, и я хочу изменить ее текстовое значение, когда нажимаю на кнопку. Я пробовал много разных способов для достижения этой цели, но, похоже, ничего не работает должным образом. Я использовал QObject :: setProperty (), и, кажется, он работает, когда я печатаю новое текстовое значение с помощью qDebug (), но он не ссылается sh на GUI. Что я делаю неправильно?

main. cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QSettings>
#include <QQuickStyle>
#include <QtQuickControls2>
#include <QQmlContext>
#include <QIcon>

#include "Controllers/Network/network.hpp"
#include "Controllers/NFC/nfc.hpp"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QIcon::setThemeName("gallery");
    QQuickStyle::setStyle("Material");

    // Property bindings:
    qmlRegisterType<RFS::Communication::Network>("rfs.communication.network", 1, 0, "Network");
    qmlRegisterType<RFS::Communication::NFC>("rfs.communication.nfc", 1, 0, "NFC");

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("availableStyles", QQuickStyle::availableStyles());
    engine.load(QUrl("qrc:/main.qml"));
    if (engine.rootObjects().isEmpty()) return -1;
    return app.exec();
}

nf c .hpp:

#include <QObject>
#include <QtNfc/qnearfieldmanager.h>
#include <QtNfc/qnearfieldtarget.h>

namespace RFS::Communication
{
    class NFC : public QObject
    {
        Q_OBJECT

    public:
        explicit NFC(QObject *parent = nullptr);
        Q_INVOKABLE bool getStatus() { return pairingStatus; }
        Q_INVOKABLE void changeTextValue();

    private:
        bool pairingStatus;
    };
}

nf c. cpp:

#include <QtQuick>
#include <QQuickView>
#include "Controllers/NFC/nfc.hpp"

void RFS::Communication::NFC::changeTextValue()
{
    QQuickView view;
    view.setSource(QUrl("qrc:/Views/overview.qml"));
    QObject *rootObject = view.rootObject();

    QList<QObject*> list = rootObject->findChildren<QObject*>();
    QObject *testLabel = rootObject->findChild<QObject*>("testLabel");

    qDebug() << "Object" << testLabel->property("text"); // Successfully prints old value
    testLabel->setProperty("text", "test1");
    qDebug() << "Object" << testLabel->property("text"); // Successfully prints new value
    QQmlProperty(testLabel, "text").write("test2");
    qDebug() << "Object" << testLabel->property("text"); // Successfully prints new value
}

Overview.qml:

import QtQuick 2.12
import QtQuick.Controls 2.12
import rfs.communication.nfc 1.0

Page {
    id: page

    NFC {
        id: nfc
    }

    SwipeView {
        id: swipeView
        anchors.fill: parent
        currentIndex: tabBar.currentIndex

        Pane {
            id: overviewTab
            width: swipeView.width
            height: swipeView.height

            Button {
                id: pairButton
                text: qsTr("Pair new receiver")

                onClicked: {
                    nfc.changeTextValue()
                }
            }

            Label {
                id: testLabel
                objectName: "testLabel"
                text: "hei" // I want to change this value
            }
        }
    }
}

Есть ли лучший способ добиться этого? Заранее большое спасибо.

...