当前位置:   article > 正文

QML Component创建方法_qml createcomponent

qml createcomponent

1. 使用Component在QML中嵌入组件

Component是Qt框架或者开发者封装好的、只暴露必要接口的QML类型,可以重复使用。要再QML中嵌入Component的定义,需要使用Component对象。

  • Component只能包含一个顶层的Item,而且在这个Item之外不能定义任何的数据,除了Id。
  • Component通常用来给一个View提供图形化组件。
  • Component不是Item的派生类,而是从QQmlComponent继承而来的,虽然它通过自己的顶层Item为其他的View提供可视化组件,但它本身不是可见元素。

下面是一个简单的在QML文档中定义Component的示例:

  1. Component {
  2. id: itemCompont
  3. Rectangle {
  4. id: compontRect
  5. color: 'blue'
  6. implicitWidth: 200
  7. implicitHeight: 50
  8. signal deleteThis()
  9. Text {
  10. id: interText
  11. anchors.left: parent.left
  12. anchors.leftMargin: 10
  13. anchors.verticalCenter: parent.verticalCenter
  14. text: qsTr("text")
  15. }
  16. Button {
  17. anchors.margins: 5
  18. anchors.top: parent.top
  19. anchors.bottom: parent.bottom
  20. anchors.right: parent.right
  21. text: '删除'
  22. onClicked: {
  23. compontRect.deleteThis()
  24. }
  25. }
  26. }
  27. }

2. 在文件中定义组件

很多时候我们把QML文件定义在一个文件中,方便被其他的QML文件调用。可以直接使用文件名作为组件的名称,在其他的QML文件中使用。上面组件中的代码可以单独定义在一个文件中,本示例的文件名为TestCompont.qml

  1. import QtQuick 2.0
  2. import QtQuick.Window 2.0
  3. import QtQuick.Controls 1.4
  4. Rectangle {
  5. id: compontRect
  6. color: Qt.rgba(0.8, 0.4, 0.4, 1.0)
  7. implicitWidth: 200
  8. implicitHeight: 50
  9. property var currentObject: ''
  10. signal deleteThis(var obj)
  11. // 设置文字的内容
  12. function setCurrentText(textName) {
  13. interText.text = textName
  14. }
  15. Text {
  16. id: interText
  17. anchors.left: parent.left
  18. anchors.leftMargin: 10
  19. anchors.verticalCenter: parent.verticalCenter
  20. text: qsTr("text")
  21. }
  22. Button {
  23. anchors.margins: 5
  24. anchors.top: parent.top
  25. anchors.bottom: parent.bottom
  26. anchors.right: parent.right
  27. text: '删除'
  28. onClicked: {
  29. compontRect.deleteThis(compontRect)
  30. }
  31. }
  32. Component.onCompleted: {
  33. compontRect.currentObject = parent
  34. }
  35. }

3. 使用Loader加载/删除组件

Loader用来动态加载QML组件。

  • source属性,加载一个QML文档。
  • sourceComponent属性,加载一个Component对象。
  • sourcesourceComponent属性发生变化时,它之前的对象会被销毁,新对象会被加载。
  • source设置为空串,或者sourceComponent设置为undefined,将会销毁当前对象,相关资源也会被释放,Loader对象会变成一个空对象。
  • item属性指向他加载的组件的顶层Item,比如上面的示例item就为Rectangle

下面是一个使用Loader加载/删除组件的一个示例,效果如下:

上面的红色Item为直接使用Component的Loader,下面为从文件中加载的组件。 代码如下:

  1. import QtQuick 2.0
  2. import QtQuick.Window 2.0
  3. import QtQuick.Controls 1.4
  4. Window {
  5. width: 800
  6. height: 600
  7. visible: true
  8. Rectangle {
  9. id: mainRect
  10. anchors.fill: parent
  11. Loader {
  12. id: loader1
  13. sourceComponent: itemCompont
  14. anchors.top: parent.top
  15. anchors.topMargin: 10
  16. width: mainRect.width
  17. height: 50
  18. function onDisDeleteThis() {
  19. loader1.sourceComponent = undefined
  20. }
  21. onLoaded: {
  22. item.color = 'red'
  23. loader1.item.deleteThis.connect(loader1.onDisDeleteThis)
  24. }
  25. }
  26. Loader {
  27. id: loader2
  28. source: 'qrc:/QML/TestCompont.qml'
  29. anchors.top: loader1.bottom
  30. anchors.topMargin: 10
  31. width: mainRect.width
  32. height: 50
  33. function onDisDeleteThis() {
  34. loader2.source = ''
  35. }
  36. onLoaded: {
  37. loader2.item.deleteThis.connect(loader2.onDisDeleteThis)
  38. }
  39. }
  40. Component {
  41. id: itemCompont
  42. Rectangle {
  43. id: compontRect
  44. color: 'blue'
  45. implicitWidth: 200
  46. implicitHeight: 50
  47. signal deleteThis()
  48. Text {
  49. id: interText
  50. anchors.left: parent.left
  51. anchors.leftMargin: 10
  52. anchors.verticalCenter: parent.verticalCenter
  53. text: qsTr("text")
  54. }
  55. Button {
  56. anchors.margins: 5
  57. anchors.top: parent.top
  58. anchors.bottom: parent.bottom
  59. anchors.right: parent.right
  60. text: '删除'
  61. onClicked: {
  62. compontRect.deleteThis()
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }

4. 使用JavaScript中的语句加载/删除组件

QML支持使用JavaScript动态创建/销毁对象,有两种方式动态创建对象:

  • 使用Qt.createComponent()动态创建一个组件对象,然后使用ComponentcreateObject()方法创建对象。
  • 使用Qt.createQmlObject()从一个QML字符串直接创建一个对象。

如果QML文件中嵌入Component,可以直接使用这个组件的createObject()方法创建组件;使用Component的destroy()方法删除已经创建的组件。destroy()方法可以指定一个延时,不过不指定,他会在适当的时候删除。 下面是一个简单的示例:

  1. import QtQuick 2.0
  2. import QtQuick.Window 2.0
  3. import QtQuick.Controls 1.4
  4. Window {
  5. width: 800
  6. height: 600
  7. visible: true
  8. Rectangle {
  9. id: mainRect
  10. anchors.fill: parent
  11. property var mainRectComponent: null
  12. Column {
  13. id: mainColumn
  14. spacing: 5
  15. width: parent.width
  16. property var count: 0
  17. function deleteItems(object) {
  18. object.destroy()
  19. }
  20. function createItem() {
  21. var color = 'red'
  22. if (mainColumn.count % 3 === 1)
  23. color = 'yellow'
  24. else if (mainColumn.count % 3 === 2)
  25. color = 'blue'
  26. mainColumn.count++
  27. // 创建一个组件
  28. var obj = itemCompont.createObject(mainColumn, {"color": color, "width": mainRect.width})
  29. //obj.setCurentObject(obj)
  30. obj.setCurrentText('Component' + mainColumn.count.toString())
  31. obj.deleteThis.connect(mainColumn.deleteItems)
  32. // 创建文件中的组件
  33. var obj2 = mainRect.mainRectComponent.createObject(mainColumn,
  34. {'color': Qt.rgba(0.4, 0.8, 0.6, 1.0)
  35. ,'width': mainRect.width})
  36. obj2.setCurrentText('Component' + mainColumn.count.toString() + ', From File TestComponent')
  37. obj2.deleteThis.connect(mainColumn.deleteItems)
  38. }
  39. }
  40. Button {
  41. anchors.top: mainColumn.bottom
  42. anchors.topMargin: 10
  43. anchors.right: mainRect.right
  44. anchors.rightMargin: 10
  45. text: '添加'
  46. onClicked: {
  47. mainColumn.createItem()
  48. }
  49. }
  50. Component.onCompleted: {
  51. if (mainRectComponent == null)
  52. mainRectComponent = mainRectComponent = Qt.createComponent('qrc:/QML/TestCompont.qml')
  53. }
  54. Component {
  55. id: itemCompont
  56. Rectangle {
  57. id: compontRect
  58. color: 'blue'
  59. implicitWidth: 200
  60. implicitHeight: 50
  61. property var currentObject: ''
  62. signal deleteThis(var obj)
  63. // 设置文字的内容
  64. function setCurrentText(textName) {
  65. interText.text = textName
  66. }
  67. Text {
  68. id: interText
  69. anchors.left: parent.left
  70. anchors.leftMargin: 10
  71. anchors.verticalCenter: parent.verticalCenter
  72. text: qsTr("text")
  73. }
  74. Button {
  75. anchors.margins: 5
  76. anchors.top: parent.top
  77. anchors.bottom: parent.bottom
  78. anchors.right: parent.right
  79. text: '删除'
  80. onClicked: {
  81. compontRect.deleteThis(compontRect)
  82. }
  83. }
  84. Component.onCompleted: {
  85. compontRect.currentObject = parent
  86. }
  87. }
  88. }
  89. }
  90. }

Component.createObject()的方法,第一个参数指定它的父对象,第二个参数可以指定这个组件的一些参数。代码的显示效果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/117521
推荐阅读
相关标签
  

闽ICP备14008679号