qml是否支持面向对象的编程

时间:2014-07-12 14:30:43

标签: qt oop qml qtquick2

我正在为我的项目使用QML,我想知道是否在另一个文件中实例化文件,是否像为c ++类实例化对象?

File.qml

Rectangle {
  id: idRect1
  .
  .
}

File2.qml

Rectangle {
  id: idRect2

  File1 {
    id:idFile1
    .
    .
  }
}

在File2.qml中我初始化了File1,这是否意味着我创建了一个File1类型的对象?请分享一些关于所有这些机制如何工作的知识(链接)。在此先感谢

1 个答案:

答案 0 :(得分:2)

在QML中创建首字母大写的文件时,您需要创建一个组件。组件使用OOP聚合(而不是子类化)实现。这意味着如果我写

// MyButton.qml
import QtQuick 2.0;
Rectangle {
    id: base;
    width: 120;
    height: 40;
    color: "lightgray";

    Text {
        text: "foobar";
        anchors.centerIn: parent;
    }
}

...我还没有子类化Rectangle,我只是创建了一个包含Rectangle作为根对象的组件,并以某种方式对其进行配置,并在其中添加了一个Text对象。

只要创建了一个组件,就可以通过简单地编写它来实现:

MyComponent { id: myNewInstance; }

因为这是QML的一种方式。

组件名称是一种类(但不是用C ++或JS方式来定义它),它也可以用作属性的类型:

property MyComponent theComponent : myNewInstance;

然后它可以保存使用给定组件创建的对象的ID,有点像C / C ++指针:该属性包含指向实际对象的链接。

但是由于QML的设计方式,即使它比子类更加聚合,自定义组件的根对象类型的属性也可以包含派生组件的ID,在我的情况下:

property Rectangle theComponent : myNewInstance;

可行,但如果我尝试将图像或文本的ID或其他东西放入,QML引擎会抛出不兼容的类型错误。

我希望它可以帮到你。