Qt 实例化一个";本地的;动态QML类型
是否可以在不同类型的子组件之间动态选择(在实例化期间) 例如,一些伪代码(使用Qt5.9):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
我认为如果没有大量的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
}
}