gpt4 book ai didi

c++ - Qt - 为 QML 定义全局函数

转载 作者:行者123 更新时间:2023-11-28 01:33:52 25 4
gpt4 key购买 nike

我对 Qt 很了解,想知道是否有解决我的问题的方法。

我想在 C++ 中定义一个应该从 QML 端调用的全局函数。我找到了一个 solution在 StackOverflow 上可以让我调用如下函数:

myObject.myFunction();

但我宁愿避免像这样的对象名称:

myFunction();

这与我们所做的相同,例如,当我们需要翻译一个字符串时:

qsTr("my string");

有可能吗?

最佳答案

你可以尝试使用setContextObject如果您使用的是 QQmlEngine,则 QQmlContext 的方法。我创建了一个 minimal 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 代码中,您现在可以访问 MyAPI 类的所有属性、信号、槽和 Q_INVOKABLE 方法:

Window {
visible: true
width: 640
height: 480

// Call the `makeUpperCase` method of the context object:
title: makeUpperCase("Hello World")
}

关于c++ - Qt - 为 QML 定义全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50281239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com