QML和C ++:访问公开类的成员

时间:2018-04-05 13:31:19

标签: c++ qt qml qt5

我正在创建一个QML绘图组件。结构看起来像这样

Rectangle {
  id: canvas
  objectName: "myPlot"
  Rectangle {
    id: plot
    PlotArea { // this is my c++ QQuickItem
      id: pa
    }
    MouseArea {} // for handling interaction with the plot, like zooming
  }
}

PlotArea是一个c ++ QQuickItem。PlotArea具有自定义c ++成员,如XAxis对象(非可视),用于计算,例如蜱。如果XAxis是XAxis,如何从QObject访问属性或可调用函数?如果我同时注册qmlRegisterType,我可以例如做这样的事情pa._xAxis.nameofmyinvokablefunction

1 个答案:

答案 0 :(得分:1)

如果你想从QML访问一个对象,这必须是一个属性,在下一部分我将展示一个例子:

<强>的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickItem>

class XAxis: public QObject{
    Q_OBJECT
public:
    using QObject::QObject;
};

class PlotArea : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(XAxis* axis READ axis WRITE setAxis NOTIFY axisChanged)
public:
    PlotArea(QQuickItem *parent=Q_NULLPTR):QQuickItem(parent){
        mAxis = new XAxis(this);
    }

    XAxis *axis() const    {
        return mAxis;
    }

    void setAxis(XAxis *ax){
        if(mAxis ==ax)
            return;
        mAxis->deleteLater();
        mAxis = ax;
        Q_EMIT axisChanged();
    }
    Q_SIGNAL void axisChanged();
private:
    XAxis *mAxis;
};

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    qmlRegisterType<PlotArea>("com.eyllanesc.foo", 1, 0, "PlotArea");
    qmlRegisterType<XAxis>("com.eyllanesc.foo", 1, 0, "XAxis");
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}

#include "main.moc"

<强> main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import com.eyllanesc.foo 1.0
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle {
        PlotArea {
            id: plot
            Component.onCompleted: console.log(plot.axis)
        }

    }
}