Я пытаюсь вызвать функцию, объявленную в базовом классе, но не могу вызвать из 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);
}

< Сильный > main.qml

function toggleCameraView(){
    g.toggleCameraView()
}

Это дает мне ошибку:

TypeError: Property 'toggleCameraView' of object G(0x2838a8) is not a function
1
Gebre 28 Май 2019 в 00:57

2 ответа

Лучший ответ

Поскольку вы не предоставили 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"

Main.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
0
eyllanesc 27 Май 2019 в 22:13
function toggleCameraView(){
    g3.toggleCameraView()
}

Почему "g3"? это должно быть "g", то же имя в ctxt->setContextProperty("g", this);

0
eyllanesc 28 Май 2019 в 02:30