2017-05-19 37 views
0

我通过发送一串手动创建一个ComboBox Qt.createQmlObject像这样:动态生成的ListView不填充基于其模型

var newQML = "ComboBox {\n"; 
newQML += " model: ListModel {\n" 
newQML += " ListElement {\n" 
newQML += "  name: \"One\"\n" 
newQML += " }\n" 
newQML += " }\n" 
newQML += "}\n" 

var cBox = Qt.createQmlObject(newQML) 

但是,组合框不填充从条目它的ListModel(它只是停留空的。)我还试图建立在这个被实例化到组件一个ListModel的,给它一个id,然后试图引用该ID在我的代码如下所示:

var newQML = "ComboBox {\n"; 
newQML += " model: sampleModel\n" 
newQML += "}\n" 

var cBox = Qt.createQmlObject(newQML) 

然而,那也行不通。请让我知道在QML中动态实例化和填充ComboBox的正确方法。

回答

0

首先,导入语句应该包含在传递给Qt.createQmlObject的字符串中。由于您使用ListModelComboBox,你应该在newQML进口QtQuickQtQuick.Controls

var newQML = "import QtQuick 2.0; \n"; 
newQML += "import QtQuick.Controls 2.0\n"; 
newQML += "ComboBox {\n"; 
newQML += " model: ListModel {\n" 
newQML += " ListElement {\n" 
newQML += "  name: \"One\"\n" 
newQML += " }\n" 
newQML += " }\n" 
newQML += "}\n" 

接下来,你需要一个父项传递给Qt.createQmlObject指定在哪里画组合框。例如,如果你把什么组合框在mainItem,然后同时通过newQMLmainItemQt.createQmlObject

Item { 
    id: mainItem 
    width: 200; height: 200 

    Button { 
     anchors.centerIn: parent 
     onClicked: { 
      var newQML = "import QtQuick 2.0; \n"; 
      newQML += "import QtQuick.Controls 2.0\n"; 
      //... 

      var cBox = Qt.createQmlObject(newQML, mainItem); 
     } 
    } 
} 

但是,如果您使用的是组合框从QtQuick.Controls 1.x,上述方法不能正常工作并且程序会给你一个空的组合框(在Qt 5.8 MSVC 2015中测试)。一个简单的解决方法是在创建对象后,该模型来分配:

var newQML = "import QtQuick 2.7; \n"; 
newQML += "import QtQuick.Controls 1.4\n"; 
newQML += "ComboBox {\n"; 
newQML += "}\n" 

var cBox = Qt.createQmlObject(newQML, mainItem) 
cBox.model = sampleModel; 

但我认为这是更好地使用QtQuick.Controls 2Qt.createComponent来代替。