Я пытаюсь вызвать функцию, объявленную в базовом классе, но не могу вызвать из 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
Поскольку вы не предоставили 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
function toggleCameraView(){
g3.toggleCameraView()
}
почему "g3" ? это должно быть "г", то же имя в ctxt->setContextProperty("g", this);
Спасибо, что заметили, это была опечатка, я только что отредактировал
@Gebre Если мой ответ поможет вам, не забудьте отметить его как правильный, если вы не знаете, как это сделать, просмотрите тур