kar*_*lip 7 c++ plugins qt qml
我正在编写一个QML扩展插件,我正在寻找一种方法来访问我刚刚实现的元素的大小.
现在,新元素(命名CustomElement)可以通过定义用户想要的任何大小来创建它的宽度和高度值,因此在用户可以执行的QML文件中:
CustomElement
{
id: my_elem
width: 800
height: 600
}
Run Code Online (Sandbox Code Playgroud)
但是我希望能够在用户通过a配置大小时检索大小信息anchor,如下所示:
Rectangle
{
width: 800
height: 600
CustomElement
{
id: my_elem
anchors.fill: parent
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何访问anchors信息.
插件类定义为:
class CustomElement: public QDeclarativeItem
{
Q_OBJECT
//Q_PROPERTY() stuff
public:
// ...
};
Run Code Online (Sandbox Code Playgroud)
在插件的构造函数中,我设置QGraphicsItem::ItemHasNoContents为false:
CustomElement::CustomElement(QDeclarativeItem* parent)
: QDeclarativeItem(parent)
{
qDebug() << "CustomElement::CustomElement parent is:" << parent;
setFlag(QGraphicsItem::ItemHasNoContents, false);
}
Run Code Online (Sandbox Code Playgroud)
加入调试后,我注意到,parent就是0,这也解释了为什么我不能与获取有用的信息boundingRect()和其他方法.显然,问题是我的插件没有父母.我该如何解决这个问题?
解决了.
阅读父母何时设定?帮助我找到了我需要做的事情.这个插件是一个图形组件(即具有可视化界面),这意味着它将在某个时刻在屏幕上绘制.当Qt完成加载组件时,它会调用一个名为componentComplete()通知您的方法.
我所要做的就是将此方法作为公共方法添加到我的类定义中:
virtual void componentComplete();
Run Code Online (Sandbox Code Playgroud)
并实现它:
void CustomElement::componentComplete()
{
Q_D(CustomElement);
// Call superclass method to set CustomElement() parent
QDeclarativeItem::componentComplete();
}
Run Code Online (Sandbox Code Playgroud)
调用超类的方法似乎设置了我的插件的父级,这使我可以访问由之设置的信息anchors.fill: parent.
然后我所要做的就是检索这些信息:
Q_Q(Video);
qDebug() << "CustomElement::play: widget size is " << q->width() << "x" << q->height();
Run Code Online (Sandbox Code Playgroud)