读取由anchors.fill:parent定义的QML元素大小

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()和其他方法.显然,问题是我的插件没有父母.我该如何解决这个问题?

kar*_*lip 5

解决了.

阅读父母何时设定?帮助我找到了我需要做的事情.这个插件是一个图形组件(即具有可视化界面),这意味着它将在某个时刻在屏幕上绘制.当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)

  • 你刚刚结束了为期三天的搜索!我可以投票十次 (2认同)