Qt 我可以用鼠标从QML中的多个代理中选择文本吗?
允许仅包含一个QML文件的桌面映像项目:Qt 我可以用鼠标从QML中的多个代理中选择文本吗?,qt,qml,qtquick2,Qt,Qml,Qtquick2,允许仅包含一个QML文件的桌面映像项目: import QtQuick 2.4 import QtQuick.Window 2.2 Window { visible: true width: 500 height: 500 ListModel { id: myModel ListElement { color: "red" text: "some interesting info
import QtQuick 2.4
import QtQuick.Window 2.2
Window {
visible: true
width: 500
height: 500
ListModel {
id: myModel
ListElement {
color: "red"
text: "some interesting information"
}
ListElement {
color: "blue"
text: "not so interesting information"
}
ListElement {
color: "green"
text: "and some more information"
}
}
ListView {
anchors.fill: parent
interactive: false
model: myModel
delegate: Rectangle {
width: parent.width
height: 30
color: model.color
TextEdit {
anchors.centerIn: parent
text: model.text
selectByMouse: true
}
}
}
}
当
TextEdit
的selectByMouse
属性设置为true时,我可以选择其中的文本。但是如何在多个代理中同时选择文本?在多个文本编辑中?甚至有可能吗?您可以将持久选择设置为true,并且您的文本编辑
中的每一个都将保持文本处于选中状态()因为其他答案似乎不完整,或者没有回答我认为VALOD9所问的问题:“您能像他们的文本编辑是一个元素一样跨多个代表选择文本吗?”
这在本质上是不可能的,但可以在QML中通过大量手动跟踪鼠标按下和移动来实现
它可以通过将MouseArea放置在ListView和每个包含DropArea的委托上来实现。要在代理上跟踪文本选择的单击/拖动,可以使用不可见的MouseArea.drag.target来触发代理DropArea的onEntered和onPositionChanged事件。基于所有这些数据,您可以在鼠标坐标结果中使用TextEdit.positionAt()来获取选择的开始和结束位置,并使用TextEdit.select()以编程方式选择每个代理中的文本。由于您是以编程方式选择文本,因此您的文本编辑需要具有selectByMouse:false
您需要在模型中存储任何必要的选择数据,因为如果代理从自动缓存的ListView中删除,您不应该在代理中存储状态。然后,当使用Component.OnCompleted从缓存重新加载选择时,您将使用此数据重新创建选择。要执行复制之类的选择操作,您可以在模型上迭代并提取保存的选择数据(特别是如果您使用TextEdit.selectedText将所选文本保存到模型中)
这将允许许多基于文本编辑的代理在跨其中任何一个代理选择文本时表现得好像他们是一个一样。同时使用活动选择进行多个不同的文本编辑违反了一个相当强的用户界面概念-尽管这是可能的,如下所述。我想知道您是否真的想让列表代理独立于文本选择而具有多个可选性(例如,跟踪其选择状态并更改矩形的颜色)?@JamesTurner这是必要的,因为标准text
和Label
元素不支持选择。如果需要可选文本,则需要在禁用编辑的情况下使用TextEdit
。