Qt 委托时,QML XmlListModel会混乱排序

Qt 委托时,QML XmlListModel会混乱排序,qt,canvas,qml,qtquick2,Qt,Canvas,Qml,Qtquick2,我正在尝试使用画布以与此xml文件相同的顺序绘制线条: <root> <doc><nopeus>80.0</nopeus><aika>40.0</aika></doc> <doc><nopeus>110.0</nopeus><aika>80.0</aika></doc> <doc><nopeus>120.0</n

我正在尝试使用
画布
以与此xml文件相同的顺序绘制线条:

<root>
<doc><nopeus>80.0</nopeus><aika>40.0</aika></doc>
<doc><nopeus>110.0</nopeus><aika>80.0</aika></doc>
<doc><nopeus>120.0</nopeus><aika>120.0</aika></doc>
<doc><nopeus>190.0</nopeus><aika>160.0</aika></doc><doc><nopeus>243.0</nopeus><aika>200.0</aika></doc><doc><nopeus>260.0</nopeus><aika>240.0</aika></doc><doc><nopeus>300.0</nopeus><aika>280.0</aika></doc><doc><nopeus>350.0</nopeus><aika>320.0</aika></doc>
</root>
Chart.qml:

import QtQuick 2.0

Rectangle {
    id: myrect
    width: 540
    height: 960
    color: "transparent"

    property int xd: 0
    property int yd: 0
    property int xc: 0
    property int yc: 0

    Canvas {
        id: mycanvas
        width: myrect.width; height: myrect.height;
        onPaint: {
                var context = getContext('2d')
                context.strokeStyle = "#FF0000"
                context.lineWidth = 2
                context.beginPath()
                context.moveTo(xc,yc)
                context.lineTo(xd,yd)
                context.stroke()
                startx = xd
                starty = yd              
         }
    }
}
问题是,为什么通过委托将结果路径插入
列表视图
?我试图通过一个函数和另一个
ListModel
分别对路径项进行排序,但结果是一样的

以下是一个屏幕截图: 将为模型中的每个项目创建代理。您的模型包含八个项目(截至您的输入)。因此,您创建了八个
Canvas
es(每一个都作为
ListView
项,即在(理论上)增加
y
w.r.t.
ListView
原点坐标)

用(可能设置错误的)起点来解决这些问题……你们会得到一个随机的混乱!您看不到这一点,因为组件上设置的大小/约束使得
画布
es往往会重叠

在本例中,您只需要一个
画布
,其中每个
myxml
项都被绘制在画布上。下面是对代码的(简单)修改,它正确地显示了xml文件中存储的路径:

// main.qml
import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.XmlListModel 2.0

Window {
    visible: true
    width: 600
    height: 600

    XmlListModel {
        id: myxml
        source: "qrc:/filename.xml"   // added to the resources
        query: "/root/doc"
        XmlRole { name: "nopeus"; query: "nopeus/string()" }
        XmlRole { name: "aika"; query: "aika/string()" }
        onStatusChanged: {
            if(status === XmlListModel.Ready)
                comp.mod = myxml    // set the model ASA it is ready to be used
        }
    }

    Chart {
        id: comp
        anchors.fill: parent
        mod: myxml
    }
}

// Chart.qml
import QtQuick 2.4
import QtQuick.XmlListModel 2.0

Item {
    property var mod: undefined

    onModChanged: {
        if(mod)
            mycanvas.requestPaint()   // repaint only when the model is available
    }

    Canvas {
        id: mycanvas
        width: parent.width; height: parent.height;
        onPaint: {
            var context = getContext('2d')
            context.strokeStyle = "#FF0000"
            context.lineWidth = 2
            context.beginPath()
            context.moveTo(0,0)
            // iterate over all the point to print them
            for(var i = 0; i < mod.count; i++)
            {
                var point = mod.get(i)
                context.lineTo(point.aika, point.nopeus)
            }
            context.stroke()
        }
    }
}
//main.qml
导入QtQuick 2.4
导入QtQuick.Window 2.2
导入QtQuick.XmlListModel 2.0
窗口{
可见:正确
宽度:600
身高:600
XmlListModel{
id:myxml
来源:“qrc:/filename.xml”//已添加到资源中
查询:“/root/doc”
XmlRole{name:“nopeus”;查询:“nopeus/string()”}
XmlRole{name:“aika”;查询:“aika/string()”}
onStatusChanged:{
如果(状态===XmlListModel.Ready)
comp.mod=myxml//在准备使用时设置模型
}
}
图表{
编号:comp
锚定。填充:父级
mod:myxml
}
}
//Chart.qml
导入QtQuick 2.4
导入QtQuick.XmlListModel 2.0
项目{
属性变量mod:未定义
onModChanged:{
if(mod)
mycanvas.requestPaint()//仅当模型可用时重新绘制
}
帆布{
id:mycanvas
宽度:parent.width;高度:parent.height;
onPaint:{
var context=getContext('2d')
context.strokeStyle=“#FF0000”
context.lineWidth=2
context.beginPath()
context.moveTo(0,0)
//迭代所有点以打印它们
对于(变量i=0;i
渲染的结果路径:


感谢您快速准确的回答!
// main.qml
import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.XmlListModel 2.0

Window {
    visible: true
    width: 600
    height: 600

    XmlListModel {
        id: myxml
        source: "qrc:/filename.xml"   // added to the resources
        query: "/root/doc"
        XmlRole { name: "nopeus"; query: "nopeus/string()" }
        XmlRole { name: "aika"; query: "aika/string()" }
        onStatusChanged: {
            if(status === XmlListModel.Ready)
                comp.mod = myxml    // set the model ASA it is ready to be used
        }
    }

    Chart {
        id: comp
        anchors.fill: parent
        mod: myxml
    }
}

// Chart.qml
import QtQuick 2.4
import QtQuick.XmlListModel 2.0

Item {
    property var mod: undefined

    onModChanged: {
        if(mod)
            mycanvas.requestPaint()   // repaint only when the model is available
    }

    Canvas {
        id: mycanvas
        width: parent.width; height: parent.height;
        onPaint: {
            var context = getContext('2d')
            context.strokeStyle = "#FF0000"
            context.lineWidth = 2
            context.beginPath()
            context.moveTo(0,0)
            // iterate over all the point to print them
            for(var i = 0; i < mod.count; i++)
            {
                var point = mod.get(i)
                context.lineTo(point.aika, point.nopeus)
            }
            context.stroke()
        }
    }
}