Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何从QML组合框组件公开属性?_Qt_Qml - Fatal编程技术网

Qt 如何从QML组合框组件公开属性?

Qt 如何从QML组合框组件公开属性?,qt,qml,Qt,Qml,我正在制作一个基于组合框的组件 import QtQuick 2.12 import QtQuick.Controls 2.12 ComboBox { id: _ComboBox property alias textInBox: _delegateText.text delegate: ItemDelegate { contentItem: Text { id: _delegateText text: name

我正在制作一个基于组合框的组件

import QtQuick 2.12
import QtQuick.Controls 2.12

ComboBox {
   id: _ComboBox
   property alias textInBox: _delegateText.text

   delegate: ItemDelegate {
        contentItem: Text {
        id: _delegateText
        text: name
        }
   }
}
当我添加一行时:
属性别名textInBox:\u delegateText.text
,我没有启动程序就终止了程序


告诉我如何从外部设置文本属性?

属性
contentItem
是一个
组件
,因此无论您放在那里,它都像是在一个单独的文件中定义的

定义组件类似于定义QML文档。QML 文档有一个顶级项,用于定义行为和 属性,并且无法定义属性或行为 在顶级项目之外。同样,组件 定义包含单个顶级项(在上面的 示例是一个矩形),并且不能在此之外定义任何数据 项,但id除外(在上例中为 红方块)

Delegate从
模型
中获取文本,因此您应该处理您的模型,而不是委托实例。在代理中,您通常通过
modelData
属性访问文本,但可以对其进行自定义

没有命名角色的模型(如所示的ListModel 将通过modelData角色提供数据。这个 还为只有一个角色的模型提供了modelData角色。在里面 这种情况下,modelData角色包含与命名角色相同的数据

因此,这就是将文本分配给代理的方式

 delegate: ItemDelegate {
       contentItem: Text {
          text: modelData
       }
 }
如果要修改它,只需修改
模型
,就可以创建各种绑定。例如,这将起作用(尽管不推荐):


我找到了解决办法。根据组合框中转移的角色,将显示模型中相应的字段

ExComboBox.qml

import QtQuick 2.12
import QtQuick.Controls 2.12

ComboBox {
   delegate: ItemDelegate {
      contentItem: Text {
         text: model[textRole]
      }
   }
}
您需要指定
textRole:“name”
或模型中的任何其他字段,而不是
“name”

main.qml

ExComboBox {
   currentIndex: 0
   model: GroupModel { }
   textRole: "name"
}

<强>注: <代码> GROMPMODE 是我从C++代码中得到的模型。

可以使用或获取当前项的文本。如果您不想要当前项目的文本,那么有必要解释一下您的目标是什么,以便我们可以帮助您找到更好的方法。顺便说一句,我不能在Windows上使用Qt5.9.9、5.13.2或6.0(同时使用qmlscene和QtQuick应用程序)重现这种崩溃。可能是main.cpp中的某些内容导致它崩溃。@Mitch我查看了应用程序输出,发现有一个错误。错误:qrc:/modules/ExComboBox.qml:6:31:别名引用无效。找不到id“_delegateText”@Mitch我不想获取该值,但我想设置该值。您不应该从外部访问委托项。这是一种延迟加载,这样的项目从外部看不到。更重要的是,以命令式方式使用声明性语言是绝对错误的。您应该使用模型,并更新模型数据提供程序以更改值。如果您能告诉我们您的真正目的,我们可以提供适当的解决方案。
ExComboBox {
   currentIndex: 0
   model: GroupModel { }
   textRole: "name"
}