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 dataChanged信号后MapItemView不会更新 我使用Qual MaMeMeMeVIEW/COD>组件,采用C++代码> QuestCaseListMease/Cuff>为基础的模型。重置模型或添加新项目或删除现有项目时,MapItemView工作正常。但是,MapItemView没有反映对已添加项的更改_Qt_Geolocation_Qml_Qtquick2 - Fatal编程技术网

Qt dataChanged信号后MapItemView不会更新 我使用Qual MaMeMeMeVIEW/COD>组件,采用C++代码> QuestCaseListMease/Cuff>为基础的模型。重置模型或添加新项目或删除现有项目时,MapItemView工作正常。但是,MapItemView没有反映对已添加项的更改

Qt dataChanged信号后MapItemView不会更新 我使用Qual MaMeMeMeVIEW/COD>组件,采用C++代码> QuestCaseListMease/Cuff>为基础的模型。重置模型或添加新项目或删除现有项目时,MapItemView工作正常。但是,MapItemView没有反映对已添加项的更改,qt,geolocation,qml,qtquick2,Qt,Geolocation,Qml,Qtquick2,我在Qt5.4中第一次遇到这个问题,但在升级到Qt5.5之后,我仍然面临这个问题 下面的例子展示了2种不同的模型:基于C++的模型:代码> QuestTistListMys和QML ListMeals>代码>。 按下右上角按钮,可以从一种型号切换到另一种型号: 使用QML模型时,在映射中单击将添加新元素并修改第一个元素 C++模型使用了 qTime,每秒修改其内容。 无论模型类型是什么,MapItemView都不会显示模型更改。从一个模型切换到另一个模型时,可以看到MapView得到更新

我在Qt5.4中第一次遇到这个问题,但在升级到Qt5.5之后,我仍然面临这个问题

下面的例子展示了2种不同的模型:基于C++的模型:代码> QuestTistListMys<代码>和QML <代码> ListMeals>代码>。 按下右上角按钮,可以从一种型号切换到另一种型号:

  • 使用QML模型时,在映射中单击将添加新元素并修改第一个元素 C++模型使用了 qTime<代码>,每秒修改其内容。
无论模型类型是什么,
MapItemView
都不会显示模型更改。从一个模型切换到另一个模型时,可以看到
MapView
得到更新

我可能遗漏了一些非常明显的东西,但我看不出是什么。提前感谢您的帮助

main.cpp代码:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "playermodel.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    PlayerModel playerModel;
    engine.rootContext()->setContextProperty("playerModel", &playerModel);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}
#ifndef PLAYERMODEL_H
#define PLAYERMODEL_H


#include <QObject>
#include <QAbstractListModel>
#include <QGeoPositionInfoSource>
#include <QTimer>
#include <QDebug>

struct PlayerData
{
    PlayerData(){    }
    PlayerData(int _Azimuth, double lat, double lng){
        Azimuth = _Azimuth;
        Latitude = lat;
        Longitude = lng;
    }

    int Azimuth = -1;
    double Latitude = 0.;
    double Longitude = 0.;

    QVariant getRole(int role) const;

    enum Roles{
        RoleAzimuth = Qt::UserRole + 1,
        RoleLatitude,
        RoleLongitude

    };

};

class PlayerModel : public QAbstractListModel
{
    Q_OBJECT
public:
    PlayerModel();

    ~PlayerModel();

    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data( const QModelIndex & index, int role = Qt::DisplayRole ) const;
    Q_INVOKABLE Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;    

    virtual bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);

    bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());

    void resetModel();
    void updateModel();

public slots:
    void testUpdateModel();

protected:
    QHash<int, QByteArray> roleNames() const;

private:
    QTimer m_timer;
    QVector< PlayerData> m_lstValues ;
};


#endif // PLAYERMODEL_H
import QtQuick 2.4
import QtQuick.Window 2.2
import QtLocation 5.3
import QtPositioning 5.0

Window {
    id:mainWnd
    visible: true
    width : 1024
    height:768
    property bool  useQMLModel: true
    Map {
       id: map
       anchors.fill: parent
       anchors.margins: 50
       plugin: Plugin{ name:"osm";}
       center: QtPositioning.coordinate(47.1, -1.6)
       zoomLevel: map.maximumZoomLevel

       MapItemView{
           id:mapItemView
           model: mainWnd.useQMLModel ? qmlModel : playerModel

           delegate: MapQuickItem {
              //anchorPoint:
              id:delegateMQI
              rotation: model.Azimuth
              sourceItem: Rectangle{
                  id:defaultDelegate
                  width:32
                  height:32
                  radius:16
                  opacity: 0.6
                  rotation:Azimuth
                  color:"blue"

                  Text{
                      text: Azimuth
                      anchors.centerIn : parent
                  }

              }
              coordinate: QtPositioning.coordinate(Latitude,Longitude)
          }

       }
       MouseArea{
           anchors.fill: parent
           enabled : useQMLModel
           //preventStealing: true
           propagateComposedEvents: true
           onClicked:
           {
               //Modify an item
               var newAzim = Math.random()*360;
               qmlModel.setProperty(0, "Azimuth", newAzim);
               //Check modification
               console.log("Azim:" + qmlModel.get(0).Azimuth );
               qmlModel.setProperty(0, "Color", "blue");


               //add a new item
               qmlModel.append({"Latitude": 47.05 + Math.random() *0.2, "Longitude":-1.75 + Math.random() *0.3, "Azimuth":0, "Color":"red"})
               console.log("Nb item:" + qmlModel.count );


               map.update();
               map.fitViewportToMapItems();

               mouse.accepted = false

           }
       }
    }


    Connections{
        target:mapItemView.model
        onDataChanged:{
            if (useQMLModel)
                console.log("dataChanged signal Azim:" + qmlModel.get(0).Azimuth );
            else
                console.log("dataChanged signal Azim:" + playerModel.data( topLeft, 0x0101) );
        }
    }

    ListModel{
        id:qmlModel
        ListElement {
            Latitude: 47.1
            Longitude: -1.6
            Azimuth: 10.0
        }

    }

    Rectangle{
        anchors.top : parent.top
        anchors.left : parent.left
        width : 400
        height : 300
        radius: 10
        color:"grey"
        ListView{
            id:lstView
            model:mapItemView.model
            anchors.fill:parent
            delegate: Text{
                width:parent.width
                height:50
                verticalAlignment: TextInput.AlignVCenter
                fontSizeMode : Text.Fit
                font.pixelSize: 42
                minimumPixelSize: 5
                text: "Latitude : " + Latitude + " - Longitude :" + Longitude + " - Azimuth : " + Azimuth
            }
        }
    }




    Rectangle{
        anchors.right : parent.right
        anchors.top : parent.top
        radius : 10
        color : "red"
        width : 200
        height : 50
        Text{
            anchors.centerIn: parent
            text:"switch model"
        }
        MouseArea{
            anchors.fill: parent
            onClicked:{
                mainWnd.useQMLModel = !mainWnd.useQMLModel;
            }
        }
    }

}

为了防止有人面临《邮报》作者报告的相同问题,Qt5.6.0解决了这个问题

请注意,这是由变更集Ib92252d18c2229bc6d43e11362b8f13cdb48f315()修复的,该变更集已合并到5.6分支中


我们也需要为您的模型提供完整的代码。理想情况下,您应该在一个代码> > .cp文件中拥有所有C++代码,并将其添加到这个问题中。该代码应包含模型的完整代码,以及设置QML、模型和运行应用程序的
main()
。感谢您的回复。事实上,我希望用更少的代码来显示问题,这就是为什么我使用QML模型代替我的C++模型,因为我与QML模型有相同的问题:我们可以看到当按下鼠标时,模型被改变(也可以使用连接元素来演示数据发送的信号)。无论如何,我在新评论中使用C++模型添加完整的代码。我现在用一个完整的例子来编辑我的问题。
import QtQuick 2.4
import QtQuick.Window 2.2
import QtLocation 5.3
import QtPositioning 5.0

Window {
    id:mainWnd
    visible: true
    width : 1024
    height:768
    property bool  useQMLModel: true
    Map {
       id: map
       anchors.fill: parent
       anchors.margins: 50
       plugin: Plugin{ name:"osm";}
       center: QtPositioning.coordinate(47.1, -1.6)
       zoomLevel: map.maximumZoomLevel

       MapItemView{
           id:mapItemView
           model: mainWnd.useQMLModel ? qmlModel : playerModel

           delegate: MapQuickItem {
              //anchorPoint:
              id:delegateMQI
              rotation: model.Azimuth
              sourceItem: Rectangle{
                  id:defaultDelegate
                  width:32
                  height:32
                  radius:16
                  opacity: 0.6
                  rotation:Azimuth
                  color:"blue"

                  Text{
                      text: Azimuth
                      anchors.centerIn : parent
                  }

              }
              coordinate: QtPositioning.coordinate(Latitude,Longitude)
          }

       }
       MouseArea{
           anchors.fill: parent
           enabled : useQMLModel
           //preventStealing: true
           propagateComposedEvents: true
           onClicked:
           {
               //Modify an item
               var newAzim = Math.random()*360;
               qmlModel.setProperty(0, "Azimuth", newAzim);
               //Check modification
               console.log("Azim:" + qmlModel.get(0).Azimuth );
               qmlModel.setProperty(0, "Color", "blue");


               //add a new item
               qmlModel.append({"Latitude": 47.05 + Math.random() *0.2, "Longitude":-1.75 + Math.random() *0.3, "Azimuth":0, "Color":"red"})
               console.log("Nb item:" + qmlModel.count );


               map.update();
               map.fitViewportToMapItems();

               mouse.accepted = false

           }
       }
    }


    Connections{
        target:mapItemView.model
        onDataChanged:{
            if (useQMLModel)
                console.log("dataChanged signal Azim:" + qmlModel.get(0).Azimuth );
            else
                console.log("dataChanged signal Azim:" + playerModel.data( topLeft, 0x0101) );
        }
    }

    ListModel{
        id:qmlModel
        ListElement {
            Latitude: 47.1
            Longitude: -1.6
            Azimuth: 10.0
        }

    }

    Rectangle{
        anchors.top : parent.top
        anchors.left : parent.left
        width : 400
        height : 300
        radius: 10
        color:"grey"
        ListView{
            id:lstView
            model:mapItemView.model
            anchors.fill:parent
            delegate: Text{
                width:parent.width
                height:50
                verticalAlignment: TextInput.AlignVCenter
                fontSizeMode : Text.Fit
                font.pixelSize: 42
                minimumPixelSize: 5
                text: "Latitude : " + Latitude + " - Longitude :" + Longitude + " - Azimuth : " + Azimuth
            }
        }
    }




    Rectangle{
        anchors.right : parent.right
        anchors.top : parent.top
        radius : 10
        color : "red"
        width : 200
        height : 50
        Text{
            anchors.centerIn: parent
            text:"switch model"
        }
        MouseArea{
            anchors.fill: parent
            onClicked:{
                mainWnd.useQMLModel = !mainWnd.useQMLModel;
            }
        }
    }

}