c++ - 在 qml 中公开一个基类函数

标签 c++ qt qml

我正在尝试调用在基类中声明的函数,但我无法从 QML 调用,这是我的代码示例

R.cpp

class R
{

public:
    virtual void startGui() = 0;
    void  toggleCameraView();

};

void R::toggleCameraView(){
  //do stuff
}

G.cpp

class G : public R
{
    Q_OBJECT
public:
  void startGui();
};

void G::startGui(){

  QQmlContext *ctxt = engine.rootContext();
  ctxt->setContextProperty("g", this);
}

ma​​in.qml

function toggleCameraView(){
    g.toggleCameraView()
}

这是给我的错误:

TypeError: Property 'toggleCameraView' of object G(0x2838a8) is not a function

最佳答案

因为您没有提供 MCVE,所以我不会指出您的代码错误的原因。相反,我将展示一个可行的示例。

如果你想从 QML 访问一个方法,这必须是一个槽或 Q_INVOKABLE,我将在我的示例中使用最后一个方法:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QDebug>

class R: public QObject
{
    Q_OBJECT
public:
    using QObject::QObject;
    virtual void startGui() = 0;
    Q_INVOKABLE void  toggleCameraView();
};

void R::toggleCameraView()
{
    qDebug() << __FUNCTION__;
}

class G: public R
{
public:
    G(QObject *parent=nullptr): R(parent){
        startGui();
        const QUrl url(QStringLiteral("qrc:/main.qml"));
        engine.load(url);
    }
    void startGui() override;
private:
    QQmlApplicationEngine engine;
};

void G::startGui()
{
    QQmlContext *ctxt = engine.rootContext();
    ctxt->setContextProperty("g", this);
}

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    G g;

    return app.exec();
}

#include "main.moc"

主.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Component.onCompleted: g.toggleCameraView()
}

输出:

toggleCameraView

关于c++ - 在 qml 中公开一个基类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56332839/

相关文章:

c++ - 可以在 C++ QObject::connect() 中连接一个 QML 对象现有信号吗?

layout - QML 行与行布局

qt - 在 QML 中根据位置更新对 MapQuickItem 进行动画处理

c++ - 用于可变参数模板实例化的 boost::hana 元组解包

android - 哪个跨移动平台应用程序和 UI 框架?

c++ - QString 和 std::string 的区别

qt - Qml 中的属性 contentItem

c++ - 在模板类中重载 operator=

c++ - C++:根据Stroustrup的示例播种随机数

java - 什么是 C/C++ 等同于 Java 的异步任务