Qt - Определить глобальную функцию для QML - PullRequest
0 голосов
/ 10 мая 2018

Я достаточно хорошо знаком с Qt и хотел бы понять, есть ли решение для моей проблемы.

Я бы хотел определить в C ++ глобальную функцию, которая должна вызываться со стороны QML.Я нашел решение в StackOverflow, которое позволило бы мне вызывать такую ​​функцию:

myObject.myFunction();

Но я бы предпочел избегать имени объекта, например:

myFunction();

это то же самое, что мы делаем, например, когда нам нужно перевести строку:

qsTr("my string");

Возможно ли это в любом случае?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете попробовать использовать setContextObject метод QQmlContext, если QQmlEngine вы используете.Я создал минимальный Gist , который демонстрирует подход.

По сути, вы создаете собственный класс, производный от QObject, скажем, MyApi:

class MyAPI : public QObject
{
    Q_OBJECT
public:
    explicit MyAPI(QObject *parent = nullptr);

    // This method will be visible as function in your QML code:
    Q_INVOKABLE QString makeUpperCase(const QString &text) const;
};

В васmain.cpp, установите экземпляр этого класса как объект контекста движка QQmlContext:

QQmlApplicationEngine engine;
engine.rootContext()->setContextObject(new MyAPI(&app));
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

В коде QML теперь вы можете получить доступ ко всем свойствам, сигналам, слотам и методам Q_INVOKABLEMyAPI класса:

Window {
    visible: true
    width: 640
    height: 480

    // Call the `makeUpperCase` method of the context object:
    title: makeUpperCase("Hello World")
}
0 голосов
/ 11 мая 2018

Самое близкое к этому можно получить, используя синглтон :

import Foo 1.0

Window {
    // ...

    Component.onCompleted: MySingleton.myFunction()
}

. Взяв пример из документации:

// First, define your QObject which provides the functionality.
class SingletonTypeExample : public QObject
{
    Q_OBJECT
    Q_PROPERTY (int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged)

public:
    SingletonTypeExample(QObject* parent = 0)
        : QObject(parent), m_someProperty(0)
    {
    }

    ~SingletonTypeExample() {}

    Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; }

    int someProperty() const { return m_someProperty; }
    void setSomeProperty(int val) { m_someProperty = val; emit somePropertyChanged(val); }

signals:
    void somePropertyChanged(int newValue);

private:
    int m_someProperty;
};

// Second, define the singleton type provider function (callback).
static QObject *example_qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    SingletonTypeExample *example = new SingletonTypeExample();
    return example;
}

// Third, register the singleton type provider with QML by calling this function in an initialization function.
qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", example_qobject_singletontype_provider);

Затем вQML:

import QtQuick 2.0
import Qt.example.qobjectSingleton 1.0
Item {
    id: root
    property int someValue: MyApi.someProperty

    Component.onCompleted: {
        someValue = MyApi.doSomething()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...