我正在创建一个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
?
答案 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)
}
}
}