在委托中引入条件
Introduce condition in delegate
我寻求在委托中引入条件。
这是一个简化的main.qml
import QtQuick 2.6
import QtQuick.Window 2.2
import QtPositioning 5.5
import QtLocation 5.6
Window {
width: 1440
height: 900
visible: true
property variant topLeftEurope: QtPositioning.coordinate(60.5, 0.0)
property variant bottomRightEurope: QtPositioning.coordinate(51.0, 14.0)
property variant boundingBox: QtPositioning.rectangle(topLeftEurope, bottomRightEurope)
Map {
id: mainMap
anchors.centerIn: parent;
anchors.fill: parent
plugin: Plugin {name: "osm"}
MapItemView {
model: myModel
delegate: Marker{}
}
visibleRegion: boundingBox
}
}
显示地图并定义边界框。
这是代表:Marker.qml
import QtQuick 2.4
import QtLocation 5.6
MapQuickItem {
id: mark
coordinate: position //"position" is roleName
... all the stuff for the marker to be displayed on the map
}
我希望添加此条件以丢弃不在要显示的边界框内的点:
if (main.boundingBox.contains(position)){
... display the marker on the map
}
但 if 不能直接在我的代码中使用。
我尝试添加一个功能:
function isMarkerViewable(){
if (!main.boundingBox.contains(position))
return;
}
但是我也不能调用它。
是否可以在委托中添加条件,如果可以,如何操作?
感谢您的帮助
正如@derM评论的那样,一种选择是使用加载器,在下面的示例中,每个点都有一个名为类型的属性,用于区分哪些项目应该绘制为矩形或圆形。
Marker.qml
import QtQuick 2.0
import QtLocation 5.6
MapQuickItem {
sourceItem: Loader{
sourceComponent:
if(type == 0)//some condition
return idRect
else if(type == 1) //another condition
return idCircle
}
Component{
id: idRect
Rectangle{
width: 20
height: 20
color: "blue"
}
}
Component{
id: idCircle
Rectangle{
color: "red"
width: 20
height: 20
radius: 50
}
}
}
main.qml
MapItemView {
model: navaidsModel
delegate: Marker{
coordinate: position
}
}
输出:
您可以在下面的 link.
中找到完整的示例
如果您的目标与性能优化无关(不是加载不需要的项目),而是仅与您的业务逻辑相关,那么对我来说最简单的解决方案似乎是使用可见的 属性 MapQuickItem 或源组件的。喜欢:
visible: main.boundingBox.contains(position)
我寻求在委托中引入条件。
这是一个简化的main.qml
import QtQuick 2.6
import QtQuick.Window 2.2
import QtPositioning 5.5
import QtLocation 5.6
Window {
width: 1440
height: 900
visible: true
property variant topLeftEurope: QtPositioning.coordinate(60.5, 0.0)
property variant bottomRightEurope: QtPositioning.coordinate(51.0, 14.0)
property variant boundingBox: QtPositioning.rectangle(topLeftEurope, bottomRightEurope)
Map {
id: mainMap
anchors.centerIn: parent;
anchors.fill: parent
plugin: Plugin {name: "osm"}
MapItemView {
model: myModel
delegate: Marker{}
}
visibleRegion: boundingBox
}
}
显示地图并定义边界框。
这是代表:Marker.qml
import QtQuick 2.4
import QtLocation 5.6
MapQuickItem {
id: mark
coordinate: position //"position" is roleName
... all the stuff for the marker to be displayed on the map
}
我希望添加此条件以丢弃不在要显示的边界框内的点:
if (main.boundingBox.contains(position)){
... display the marker on the map
}
但 if 不能直接在我的代码中使用。
我尝试添加一个功能:
function isMarkerViewable(){
if (!main.boundingBox.contains(position))
return;
}
但是我也不能调用它。
是否可以在委托中添加条件,如果可以,如何操作?
感谢您的帮助
正如@derM评论的那样,一种选择是使用加载器,在下面的示例中,每个点都有一个名为类型的属性,用于区分哪些项目应该绘制为矩形或圆形。
Marker.qml
import QtQuick 2.0
import QtLocation 5.6
MapQuickItem {
sourceItem: Loader{
sourceComponent:
if(type == 0)//some condition
return idRect
else if(type == 1) //another condition
return idCircle
}
Component{
id: idRect
Rectangle{
width: 20
height: 20
color: "blue"
}
}
Component{
id: idCircle
Rectangle{
color: "red"
width: 20
height: 20
radius: 50
}
}
}
main.qml
MapItemView {
model: navaidsModel
delegate: Marker{
coordinate: position
}
}
输出:
您可以在下面的 link.
中找到完整的示例如果您的目标与性能优化无关(不是加载不需要的项目),而是仅与您的业务逻辑相关,那么对我来说最简单的解决方案似乎是使用可见的 属性 MapQuickItem 或源组件的。喜欢:
visible: main.boundingBox.contains(position)