2017-05-19 36 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來代替。