Qt 实例化一个";本地的;动态QML类型

Qt 实例化一个";本地的;动态QML类型,qt,qml,Qt,Qml,是否可以在不同类型的子组件之间动态选择(在实例化期间) 例如,一些伪代码(使用Qt5.9): 我认为如果没有大量的javascript,没有一种方法可以完全实现您想要的。我能想到的最干净的方法是如下。 您可以使用以下方法使ColumnLayout不可见,并将列设置为其子项的父项: //MyComp.qml import QtQuick 2.9 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.5 Item { property

是否可以在不同类型的子组件之间动态选择(在实例化期间)

例如,一些伪代码(使用Qt5.9):



我认为如果没有大量的javascript,没有一种方法可以完全实现您想要的。我能想到的最干净的方法是如下。 您可以使用以下方法使ColumnLayout不可见,并将列设置为其子项的父项:

//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
    }
}

也许你可以解释一下你试图通过它实现什么,因为有各种各样的方法可以做到这一点,正确的选择取决于你的用例。有些可能很简单(只需使用
加载器),有些可能相当复杂。我最初使用这个MyComp组件,里面有一个ColumnLayout,它工作得很好,只是在ColumnLayout中放置了一个子组件:一个自定义的“本机”文本类型,一个接一个地启用WordWrap&ElideLight。因此,当此文本有多行时,文本(属性)将显示在下一个文本的顶部。我注意到,在使用ColumnLayout时,Text.contentHeight始终返回单行的值,即使对于调整为换行的多行文本也是如此。lineNumber属性也返回1。但是,如果存在“\n”,则两个属性都返回正确的值。另一方面,该列工作正常。您能发布一个代码来说明您刚才在评论中描述的问题吗?我一直在使用其他开发人员创建的自定义组件,其中包含一个
文本
。文档中说contentHeight和lineCount应该返回那些期望值。我相信
ColumnLayout
可能存在错误。无论如何,我也会尝试使用
标签
,并提出一个建议。
ColumnLayout
中的
文本
是静态放置的,但是
文本
是在运行时从本地数据库读取的。我通过设置
布局。preferredHeight
属性解决了这个问题。对于具有相同问题的任何人,如果所包含的
文本
由于在
ColumnLayout
中换行而为多行(使用
Column
可以正常工作),我必须相应地设置该属性,否则对齐将关闭。我在原始文档中找不到这方面的任何参考,所以这是一个尝试和错误。因为我在最初的问题中没有提到这个问题,所以我接受@RickPat的答案,因为他的解决方案并不完全是被问到的,但在这种情况下也会起作用。
 //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
    ...
   }
 }
//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
    }
}