ÀûÓÃ
Loader ¶¯Ì¬´´½¨ÓëÏú»Ù×é¼þ
ÏÖÔÚÎÒÃÇ¿´¿´ÈçºÎ¶¯Ì¬´´½¨¡¢Ïú»Ù×é¼þ¡£ÏÂÃæÊÇ dynamic_component.qml
£º
import QtQuick 2.0 import QtQuick.Controls 1.1 Rectangle { width: 320; height: 240; color: "#EEEEEE"; id: rootItem; property var colorPickerShow : false; Text { id: coloredText; anchors.horizontalCenter: parent.horizontalCenter; anchors.top: parent.top; anchors.topMargin: 4; text: "Hello World!"; font.pixelSize: 32; } Button { id: ctrlButton; text: "Show"; anchors.left: parent.left; anchors.leftMargin: 4; anchors.bottom: parent.bottom; anchors.bottomMargin: 4; onClicked:{ if(rootItem.colorPickerShow){ redLoader.source = ""; blueLoader.source = ""; rootItem.colorPickerShow = false; ctrlButton.text = "Show"; }else{ redLoader.source = "ColorPicker.qml"; redLoader.item.colorPicked.connect(onPickedRed); blueLoader.source = "ColorPicker.qml"; blueLoader.item.colorPicked.connect(onPickedBlue); redLoader.focus = true; rootItem.colorPickerShow = true; ctrlButton.text = "Hide"; } } } Loader{ id: redLoader; anchors.left: ctrlButton.right; anchors.leftMargin: 4; anchors.bottom: ctrlButton.bottom; KeyNavigation.right: blueLoader; KeyNavigation.tab: blueLoader; onLoaded:{ if(item != null){ item.color = "red"; item.focus = true; } } onFocusChanged:{ if(item != null){ item.focus = focus; } } } Loader{ id: blueLoader; anchors.left: redLoader.right; anchors.leftMargin: 4; anchors.bottom: redLoader.bottom; KeyNavigation.left: redLoader; KeyNavigation.tab: redLoader; onLoaded:{ if(item != null){ item.color = "blue"; } } onFocusChanged:{ if(item != null){ item.focus = focus; } } } function onPickedBlue(clr){ coloredText.color = clr; if(!blueLoader.focus){ blueLoader.focus = true; redLoader.focus = false; } } function onPickedRed(clr){ coloredText.color = clr; if(!redLoader.focus){ redLoader.focus = true; blueLoader.focus = false; } } }
|
Õâ´ÎÎÒÃÇÔÚ½çÃæÉÏ·ÅÒ»¸ö°´Å¥£¬Í¨¹ý°´Å¥À´¿ØÖÆÑÕɫѡÔñ×é¼þµÄ´´½¨ÓëÏú»Ù¡£Æô¶¯Ó¦ÓÃʱûÓд´½¨ÑÕɫѡÔñ×é¼þ£¬Èçͼ
4 Ëùʾ£º

ͼ 4 ¶¯Ì¬´´½¨×é¼þ³õʼЧ¹û
µ±Äãµã»÷ "Show" °´¼ü£¬´úÂëͨ¹ýÉèÖà redLoader ºÍ blueLoader
µÄ source À´´´½¨ÑÕɫѡÔñ×é¼þ£¬Á¬½ÓÑÕÉ«×é¼þµÄ colorPicked Ðźŵ½ÏàÓ¦µÄ·½·¨£¬Í¬Ê±½«¸Ä±ä°´Å¥ÎÄ×Ö£¬Ò²¸Ä±ä
rootItem ά»¤µÄÑÕÉ«×é¼þÊÇ·ñÏÔʾµÄ±ê־λÒÔ±ãÏ´ÎÔÙµã»÷°´Å¥¿ÉÒÔÕý³£ÏÔʾ¡£Í¼ 5 ÊÇÑÕɫѡÔñ×é¼þÏÔʾºóµÄЧ¹ûͼ£º

ͼ 5 ÑÕÉ«×é¼þ´´½¨ºóµÄЧ¹û
ʹÓà Loader ¿ØÖÆ×é¼þµÄ¶¯Ì¬´´½¨ÓëÏú»Ù£¬Ö»ÊÇ Qt Quick ÌṩµÄ¶¯Ì¬Î¬»¤¶ÔÏóµÄÁ½ÖÖ·½Ê½ÖеÄÒ»ÖÖ¡£»¹ÓÐÒ»ÖÖ£¬ÊÇÔÚ
JavaScript Öж¯Ì¬´´½¨ QML ¶ÔÏó¡£
ÔÚ JavaScript Öж¯Ì¬´´½¨ QML ¶ÔÏó
ML Ö§³ÖÔÚ JavaScript Öж¯Ì¬´´½¨¶ÔÏó¡£Õâ¶ÔÓÚÑÓ³Ù¶ÔÏóµÄ´´½¨¡¢Ëõ¶ÌÓ¦ÓÃµÄÆô¶¯Ê±¼ä¶¼ÊÇÓаïÖúµÄ¡£Í¬Ê±ÕâÖÖ»úÖÆÒ²Ê¹µÃÎÒÃÇ¿ÉÒÔ¸ù¾ÝÓû§µÄÊäÈë»òÕßijЩʼþÀ´¶¯Ì¬µÄ½«¿É¼ûÔªËØÌí¼Óµ½Ó¦Óó¡¾°ÖС£
ÔÚ JavaScript ÖУ¬ÓÐÁ½ÖÖ·½Ê½¿ÉÒÔ¶¯Ì¬µØ´´½¨¶ÔÏó£º
ʹÓà Qt.createComponent() ¶¯Ì¬µØ´´½¨Ò»¸ö×é¼þ¶ÔÏó£¬È»ºóʹÓÃ
Component µÄ createObject() ·½·¨´´½¨¶ÔÏó
ʹÓà Qt.createQmlObject() ´ÓÒ»¸ö QML ×Ö·û´®Ö±½Ó´´½¨Ò»¸ö¶ÔÏó
Èç¹ûÄãÔÚÒ»¸ö qml ÎļþÖж¨ÒåÁËÒ»¸ö×é¼þ£¨±ÈÈçÎÒÃÇµÄ ColorPicker
£©£¬¶øÄãÏ붯̬µØ´´½¨ËüµÄʵÀý£¬Ê¹Óà Qt.createComponent() ÊDZȽϺõķ½Ê½£»¶øÈç¹ûÄãµÄ
QML ¶ÔÏó±¾ÉíÊÇÔÚÓ¦ÓÃÔËÐÐʱ²úÉúµÄ£¬ÄÇ Qt.createQmlObject() ¿ÉÄÜÊDZȽϺõÄÑ¡Ôñ¡£
´Ó×é¼þÎļþ¶¯Ì¬´´½¨ Component
Qt ¶ÔÏóµÄ createComponent() ·½·¨¿ÉÒÔ¸ù¾Ý QML
Îļþ¶¯Ì¬µÄ´´½¨Ò»¸ö×é¼þ¡£Ò»µ©ÄãÓµÓÐÁË×é¼þ¶ÔÏ󣬾ͿÉÒÔµ÷ÓÃËüµÄ createObject() ·½·¨´´½¨Ò»¸ö×é¼þµÄʵÀý¡£ÏÂÃæÊÇÎÒÃÇеÄʾÀý£¬
qml ÎļþÊÇ qt_create_component.qml £º
import QtQuick 2.0 import QtQuick.Controls 1.1 Rectangle { id: rootItem; width: 360; height: 300; property var count: 0; property Component component: null; Text { id: coloredText; text: "Hello World!"; anchors.centerIn: parent; font.pixelSize: 24; } function changeTextColor(clr){ coloredText.color = clr; } function createColorPicker(clr){ if(rootItem.component == null){ rootItem.component = Qt.createComponent("ColorPicker.qml"); } var colorPicker; if(rootItem.component.status == Component.Ready) { colorPicker = rootItem.component.createObject(rootItem, {"color" : clr, "x" : rootItem.count *55, "y" : 10}); colorPicker.colorPicked.connect(rootItem.changeTextColor); } rootItem.count++; } Button { id: add; text: "add"; anchors.left: parent.left; anchors.leftMargin: 4; anchors.bottom: parent.bottom; anchors.bottomMargin: 4; onClicked: { createColorPicker(Qt.rgba(Math.random(), Math.random(), Math.random(), 1)); } } } |
ͼ 6 ÊÇʾÀýÆô¶¯ºóµÄ½çÃæ£º
ͼ 6 qt create component
³õʼЧ¹û
ͼ 7 ÊÇÎÒµã»÷ÁË 6 ´Î "add" °´Å¥ºóµÄЧ¹û£º
ͼ 7 ¶¯Ì¬´´½¨ÁËÑÕɫѡÔñ×é¼þ
ºÃÀ²£¬ÏÖÔÚÈÃÎÒÃÇÀ´¿´¿´´úÂë¡£
ÎÒÔÚ qt_create_component.qml Öж¨ÒåÁË createColorPicker()
º¯Êý£¬¸Ãº¯ÊýµÄ²ÎÊýÊÇÑÕɫֵ£¬Ëü¸ù¾ÝÑÕɫֵÀ´´´½¨Ò»¸öÑÕɫѡÔñ×é¼þʵÀý¡£Ê×ÏÈËüÅÐ¶Ï rootItem µÄ component
ÊôÐÔÈç¹ûΪ null £¬¾Íµ÷Óà Qt.createComponent() ´´½¨Ò»¸ö ColorPicker
×é¼þ£¬È»ºóµ÷Óà Component.createObject() ´´½¨Ò»¸öÑÕɫѡÔñ×é¼þʵÀý¡£ createObject()
·½·¨ÓÐÁ½¸ö²ÎÊý£¬µÚÒ»¸ö²ÎÊýÓÃÀ´Ö¸¶¨´´½¨³öÀ´µÄ item µÄ parent £¬µÚ¶þ¸ö²ÎÊýÓÃÀ´´«µÝ³õʼ»¯²ÎÊý¸ø´ý´´½¨µÄ
item £¬ÕâЩ²ÎÊýÒÔ key - value µÄÐÎʽ±£´æÔÚÒ»¸ö¶ÔÏóÖС£ÎÒÔÚ´´½¨ÑÕÉ«×é¼þʵÀýʱ£¬´«µÝÑÕÉ«¡¢
x ¡¢ y Èý¸öÊôÐÔ¸ø´ý´´½¨µÄ item £¬ÓÚÊÇÄã¿´µ½ÁË£¬ÄÇЩɫ¿é¶¼ÔÚ½çÃæ¶¥²¿¡£´´½¨ÁËÑÕɫѡÔñ×é¼þʵÀý£¬ÎÒµ÷ÓÃ
colorPicked ÐÅºÅµÄ connect() ·½·¨£¬Á¬½Ó rootItem µÄ changeTextColor
·½·¨£¬ÒÔ±ãÓû§µã»÷É«¿éʱ¸Ä±ä "Hello World!" Îı¾µÄÑÕÉ«¡£
ÔÙÀ´¿´ "add" °´Å¥£¬ËüµÄ onClicked ÐźŴ¦ÀíÆ÷£¬µ÷Óà Math
¶ÔÏóµÄËæ»úº¯Êý random() ºÍ Qt.rgba() £¬Ëæ»úÉú³ÉÒ»¸ö Color ¶ÔÏ󣬴«µÝ¸ø createColorPicker()
·½·¨À´´´½¨Ö¸¶¨ÑÕÉ«µÄÑÕɫѡÔñ×é¼þʵÀý¡£
Ìáһϣ¬¶ÔÓÚǶÈëÔÚ qml ÎĵµÄÚ¶¨ÒåµÄ Component £¬ÒòΪ Component ¶ÔÏóÊÇÏֳɵģ¬¿ÉÒÔÂÔÈ¥
Qt.createComponent() µ÷Óã¬Ö±½ÓʹÓà createObject() ·½·¨´´½¨×é¼þʵÀý¡£
´úÂë¾ÍÕâô¼òµ¥£¬½â˵µ½´ËΪֹ¡£ÏÖÔÚÈÃÎÒÃÇ¿´¿´ÔõôʹÓà Qt.createQmlObject() À´´´½¨¶ÔÏó¡£
´Ó QML ×Ö·û´®´´½¨¶ÔÏó
Èç¹ûÄãµÄÈí¼þ£¬ÐèÒªÔÚÔËÐйý³ÌÖУ¬¸ù¾ÝÓ¦ÓõÄ״̬ÊÊʱµÄÉú³ÉÓÃÓÚÃèÊö¶ÔÏóµÄ
QML ×Ö·û´®£¬½ø¶ø¸ù¾ÝÕâ¸ö QML ×Ö·û´®´´½¨¶ÔÏó£¬ÄÇô¿ÉÒÔʹÓÃÏñÏÂÃæÕâÑù£º
var newObject = Qt.createQmlObject('import QtQuick 2.0; Rectangle {color: "red"; width: 20; height: 20}', parentItem, "dynamicSnippet1"); |
createQmlObject µÄµÚÒ»¸ö²ÎÊýÊÇÒª´´½¨¶ÔÏóµÄ QML ×Ö·û´®£¬¾ÍÏñÒ»¸ö QML ÎĵµÒ»Ñù£¬ÄãÐèÒªµ¼ÈëÄãÓõ½µÄËùÓÐÀàÐͺÍÄ£¿é£»µÚ¶þ¸ö²ÎÊýÓÃÓÚÖ¸¶¨Òª´´½¨µÄ¶ÔÏóµÄ¸¸¶ÔÏó£»µÚÈý¸ö²ÎÊý£¬ÓÃÓÚ¸øÐ´´½¨µÄ¶ÔÏó¹ØÁªÒ»¸öÎļþ·¾¶£¬Ö÷ÒªÓÃÓÚ±¨¸æ´íÎó¡£
¶ÔÓÚ¶¯Ì¬´´½¨µÄ¶ÔÏ󣬸ÃÈçºÎÏú»ÙÄØ£¿
Ïú»Ù¶¯Ì¬´´½¨µÄ¶ÔÏó
ÓÐЩÈí¼þ£¬ÔÚ²»ÐèÒªÒ»¸ö¶¯Ì¬´´½¨µÄ QML ¶ÔÏóʱ£¬½ö½öÊǰÑËüµÄ visible
ÊôÐÔÉèÖÃΪ false »òÕß°Ñ opactity ÊôÐÔÉèÖÃΪ 0 £¬¶ø²»ÊÇɾ³ýÕâ¸ö¶ÔÏó¡£Èç¹û¶¯Ì¬´´½¨µÄ¶ÔÏóºÜ¶à£¬ÎÞÓõĶÔÏó¶¼Õâô´¦Àí¶ø²»Ö±½Óɾ³ý£¬ÄÇ»á¸øÈí¼þ´øÀ´±È½Ï´óµÄÐÔÄÜÎÊÌ⣬±ÈÈçÄÚ´æÕ¼ÓÃÔö¶à£¬ÔËÐÐËٶȱäÂýµÈµÈ¡£ËùÒÔÄØ£¬¶¯Ì¬´´½¨µÄ¶ÔÏ󣬲»ÔÙʹÓÃʱ£¬×îºÃ°ÑËüɾ³ýµô¡£
ÎÒÃÇÕâÀï˵µÄ¶¯Ì¬´´½¨µÄ¶ÔÏó£¬ÌØÖ¸Ê¹Óà Qt.createComponent()
»ò Qt.createQmlObject() ·½·¨´´½¨µÄ¶ÔÏó£¬ Ê¹Óà Loader ´´½¨µÄ¶ÔÏó£¬Ó¦µ±Í¨¹ý½«
source ÉèÖÃΪ¿Õ´®»ò½« sourceComponent ÉèÖÃΪ undefined ´¥·¢ Loader
Ïú»ÙËüÃÇ¡£
Ҫɾ³ýÒ»¸ö¶ÔÏ󣬿ÉÒÔµ÷ÓÃÆä destroy() ·½·¨¡£ destroy()
·½·¨ÓÐÒ»¸ö¿ÉÑ¡²ÎÊý£¬Ö¸¶¨ÑÓ³Ù¶àÉÙºÁÃëÔÙɾ³ýÕâ¸ö¶ÔÏ󣬯äĬÈÏֵΪ 0 ¡£ destroy() ·½·¨Óеã¶ùÏñ
Qt C++ ÖÐ QObject µÄ deleteLater() ·½·¨£¬¼´±ãÄãÉ趨ÑÓ³ÙΪ 0 È¥µ÷ÓÃËü£¬¶ÔÏóÒ²²¢²»»áÁ¢¼´É¾³ý£¬QML
ÒýÇæ»áÔÚµ±Ç°´úÂë¿éÖ´ÐнáÊøºóµÄij¸öºÏÊʵÄʱ¿Ìɾ³ýËüÃÇ¡£ËùÒÔÄØ£¬¼´±ãÄãÔÚÒ»¸ö¶ÔÏóÄÚ²¿µ÷Óà destroy()
·½·¨Ò²Êǰ²È«µÄ¡£
ÏÖÔÚÈÃÎÒÎÒÃÇÔÙÀ´Ò»¸öʵÀý£¬¿´¿´ÈçºÎÏú»Ù¶ÔÏó¡£Ð嵀 qml ÎļþÃüÃûΪ delete_dynamic_object.qml
£¬´Ó qt_create_component.qml ¿½±´¶øÀ´£¬×÷ÁËÒ»µãµãÐ޸ġ£ÏÈ¿´Ï£º
import QtQuick 2.0 import QtQuick.Controls 1.1 Rectangle { id: rootItem; width: 360; height: 300; property var count: 0; property Component component: null; Text { id: coloredText; text: "Hello World!"; anchors.centerIn: parent; font.pixelSize: 24; } function changeTextColor(clr){ coloredText.color = clr; } function createColorPicker(clr){ if(rootItem.component == null){ rootItem.component = Qt.createComponent("ColorPicker.qml"); } var colorPicker; if(rootItem.component.status == Component.Ready) { colorPicker = rootItem.component.createObject(rootItem, {"color" : clr, "x" : rootItem.count *55, "y" : 10}); colorPicker.colorPicked.connect(rootItem.changeTextColor); //[1] add 3 lines to delete some obejcts if(rootItem.count % 2 == 1) { colorPicker.destroy(1000); } } rootItem.count++; } Button { id: add; text: "add"; anchors.left: parent.left; anchors.leftMargin: 4; anchors.bottom: parent.bottom; anchors.bottomMargin: 4; onClicked: { createColorPicker(Qt.rgba(Math.random(), Math.random(), Math.random(), 1)); } } } |
Ð޸ĵIJ¿·ÖÎÒÓÃ×¢Êͱê×¢³öÀ´ÁË£ºÌí¼ÓÁËÈýÐдúÂ룬д´½¨µÄÑÕɫѡÔñ×é¼þʵÀý£¬¸ôÒ»¸öɾһ¸ö£¬
destroy(1000) µ÷ÓÃָʾ¶ÔÏóÔÚ 1 Ãëºóɾ³ý¡£
ͼ 8 ÊÇÔËÐкóµÄЧ¹ûͼ£º

ͼ 8 ɾ³ý¶¯Ì¬´´½¨µÄ¶ÔÏó
ÎÒ»¹ÖÆ×÷ÁËÒ»¸öÑÝʾɾ³ý¶¯Ì¬´´½¨µÄ¶ÔÏóµÄʾÀý£¬ qml ÎļþÊÇ delete_dynamic_object2.qml
£¬ÎҰѵã»÷ "add" °´Å¥´´½¨µÄ¶ÔÏó±£´æÔÚÒ»¸öÊý×éÖУ¬µ±Äãµã»÷ "del"
°´Å¥Ê±£¬É¾³ý×îºóÌí¼ÓµÄÄǸöÑÕɫѡÔñ×é¼þʵÀý¡£ÏÂÃæÊÇ´úÂ룺
import QtQuick 2.0 import QtQuick.Controls 1.1 Rectangle { id: rootItem; width: 360; height: 300; property var count: 0; property Component component: null; property var dynamicObjects: new Array(); Text { id: coloredText; text: "Hello World!"; anchors.centerIn: parent; font.pixelSize: 24; } function changeTextColor(clr){ coloredText.color = clr; } function createColorPicker(clr){ if(rootItem.component == null){ rootItem.component = Qt.createComponent("ColorPicker.qml"); } var colorPicker; if(rootItem.component.status == Component.Ready) { colorPicker = rootItem.component.createObject(rootItem,
{"color" : clr, "x" : rootItem.dynamicObjects.length *55, "y" : 10}); colorPicker.colorPicked.connect(rootItem.changeTextColor); rootItem.dynamicObjects[rootItem.dynamicObjects.length] = colorPicker; console.log("add, rootItem.dynamicObject.length = ", rootItem.dynamicObjects.length); } } Button { id: add; text: "add"; anchors.left: parent.left; anchors.leftMargin: 4; anchors.bottom: parent.bottom; anchors.bottomMargin: 4; onClicked: { createColorPicker(Qt.rgba(Math.random(), Math.random(), Math.random(), 1)); } } Button { id: del; text: "del"; anchors.left: add.right; anchors.leftMargin: 4; anchors.bottom: add.bottom; onClicked: { console.log("rootItem.dynamicObject.length = ", rootItem.dynamicObjects.length); if(rootItem.dynamicObjects.length > 0){ var deleted = rootItem.dynamicObjects.splice(-1, 1); deleted[0].destroy(); } } } } |
Äã¿ÉÒÔ×Ô¼ºÊ¹Óà qmlscene ÔËÐÐ delete_dynamic_object2.qml ¿´¿´Ð§¹û¡£
|