动态实例化“本机” QML类型

时间:2019-03-02 14:47:18

标签: qt qml

是否可以在实例化期间动态地在不同类型的子组件之间进行选择?

例如,一些伪代码(使用Qt 5.9):

 //MyComp.qml
 import QtQuick 2.9
 import QtQuick.Layouts 1.3          

 Item {
   property bool useLayout: true

   //Here I want to allow the user to choose
   //whether a ColumnLayout or Column is used 
   //(e.g., by means of the useLayout property)
   ColumnLayout { //Or Column
     ...
   }
 ...
 }     

 //main.qml
 import QtQuick 2.9
 import QtQuick.Layouts 1.3
 import QtQuick.Controls 2.9

 ApplicationWindow {
 width: 640
 height: 480
 ...
  MyComp {
    id: a
    useLayout: false
    ...
   }
 }

1 个答案:

答案 0 :(得分:1)

我认为如果没有很多JavaScript,就没有一种方法可以准确地完成您想要的事情。我可以想到的最干净的方法是以下方法。 您可以使ColumnLayout不可见,并将Column设置为其子级的父级,如下所示:

//MyComp.qml
import QtQuick 2.9
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.5

Item {
    property bool useLayout: true


    ColumnLayout {
        id: columnLayout

        visible: useLayout

        Component.onCompleted: {
            if (!useLayout) {
                butt1.parent = column;
                butt2.parent = column;
                butt3.parent = column;
            }
        }

        Button {
            id: butt1
            text: "butt 1"
        }
        Button {
            id: butt2
            text: "butt 2"
        }
        Button {
            id: butt3
            text: "butt 3"
        }
    }
    Column {
        id: column

        visible: !useLayout
    }
}