Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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 使用来自C+;的信号更新QML上的MapCircle+; 我试图从C++中的一个信号中更新QML中的一个MMAPLE循环,我VEVEN整天都有几个问题。p>_Qt_Qml_Qvariant_Qqmlengine_Qtpositioning - Fatal编程技术网

Qt 使用来自C+;的信号更新QML上的MapCircle+; 我试图从C++中的一个信号中更新QML中的一个MMAPLE循环,我VEVEN整天都有几个问题。p>

Qt 使用来自C+;的信号更新QML上的MapCircle+; 我试图从C++中的一个信号中更新QML中的一个MMAPLE循环,我VEVEN整天都有几个问题。p>,qt,qml,qvariant,qqmlengine,qtpositioning,Qt,Qml,Qvariant,Qqmlengine,Qtpositioning,在我的班级里,我有一个Q_属性,它是只读的,并在QVariantList中保存4架无人机的GPS位置 class GCS: public QObject { Q_PROPERTY(QVariantList getUavPosition READ getUavPosition NOTIFY uavPositionSet) public: QVariantList getUavPosition() ; signals: void uavPositi

在我的班级里,我有一个
Q_属性
,它是只读的,并在
QVariantList中保存4架无人机的GPS位置

class GCS: public QObject
{
    Q_PROPERTY(QVariantList getUavPosition READ getUavPosition NOTIFY uavPositionSet)

    public:
      QVariantList getUavPosition() ; 
    signals:
      void uavPositionSet();
     public slots:
       void setUavPosition();
       void triggerPosition();
     private: 
       QVariantList connected_uavs;
       QVector<QGeoCoordinate> uav_positions;         

};
在我的主要功能中,我将
triggerPosition
连接到计时器,以便定期更新位置

int main(int argc, char *argv[])
{
     ros::init(argc, argv, "planner");
    QGuiApplication app(argc, argv);

     QQmlApplicationEngine engine;
     QQmlContext* context = engine.rootContext();
     GCS gcs;
     context->setContextProperty("planner", &gcs);    
     engine.load(QUrl(QStringLiteral("qrc:/planner.qml")));

     QTimer *timer = new QTimer();
     timer->setInterval(1000);
     QObject::connect(&gcs, SIGNAL(uavPositionSet()), &gcs, SLOT(setUavPosition()));
     QObject::connect(timer, SIGNAL(timeout()), &gcs, SLOT(triggerPosition()));
     timer->start();

    return app.exec();
}
然而,当我运行我的程序时,有一点延迟,我的
mouseArea
变得不可用,程序崩溃。当我试图打印经度以查看其是否更新时,初始值会多次打印到终端,但随后程序崩溃,地图上没有
MapCircle

我的Qml文件的相关部分如下所示:

 Map{
        id: map
        anchors.fill:parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(0.5, 0.5)
        zoomLevel:50

        MapCircle{
            id:uavPos
            radius:2
            color:'black'
            border.width:3   
        }

    Connections{
        id:uavConnection
        target: planner
        onUavPositionSet:{

        var data = planner.getUavPosition
        uavPos.center = QtPositioning.coordinate(data[0].latitude, data[0].longitude)
        console.log(data[0].longitude)
        }

        }

    }

有人能在这里给我指出正确的方向吗?

如果您要处理来自多个元素的信息,那么最好使用一个模型(与一个转发器一起创建多个元素),因此只需要修改项目的角色:

gcs.h

\ifndef GCS\H
#定义GCS_H
#包括
类QS标准模型;
类qabstractemodel;
GCS类:公共QoObject
{
Q_对象
Q_属性(QObject*uavModel读取uavModel常量)
公众:
枚举UAVRoles{
PositionRole=Qt::UserRole+1000
};
GCS(QObject*parent=nullptr);
QObject*uavModel()常量;
公共Q_槽:
void triggerPosition();
私人:
QStandardItemModel*m_uavModel;
};
#endif//GCS\u H
gcs.cpp

#包括“gcs.h”
#包括
#包括
#包括
GCS::GCS(QObject*父对象):
QoObject(父对象),m_uavModel(新QStandardItemModel(本))
{
m_uavModel->setItemRoleNames({{PositionRole,“position”});
对于(int i=0;i<4;i++){
QStandardItem*项=新QStandardItem;
item->setData(QVariant::fromValue(QGeoCoordinate()),PositionRole);
m_uavModel->appendRow(项目);
}
}
QObject*GCS::uavModel()常量{
返回m_uavModel;
}
无效GCS::triggerPosition(){
标准:mt19937 rng;
种子(std::random_device());
标准:正态分布区(-0.0001,+0.0001);
如果(QStandardItem*item=m_uavModel->item(0)){
QGeoCoordination uav_id;
无人机id设置纬度(0.5+距离(rng));
无人机识别码设定经度(0.5+距离(rng));
无人机识别号设定高度(5);
item->setData(QVariant::fromValue(uav_id)、PositionRole);
}
}
main.cpp

#包括“gcs.h”
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QCoreApplication::setAttribute(Qt::AA_enableHighdDiscaling);
QGUI应用程序应用程序(argc、argv);
地面军事系统;
qqmlaplicationengine;
QQmlContext*context=engine.rootContext();
上下文->设置上下文属性(“计划器”、&gcs);
const-QUrl(QStringLiteral(“qrc:/planner.qml”);
QObject::connect(&engine),&QQmlApplicationEngine::objectCreated,
&应用程序,[url](QObject*obj,const-quorl和objUrl){
如果(!obj&&url==objUrl)
QCoreApplication::退出(-1);
},Qt::QueuedConnection);
引擎加载(url);
定时器;
定时器设置间隔(1000);
QObject::connect(&timer,&QTimer::timeout,&gcs,&gcs::triggerPosition);
timer.start();
返回app.exec();
}
planner.qml

import QtQuick 2.14
import QtQuick.Window 2.14
import QtLocation 5.14
import QtPositioning 5.14

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Plugin {
        id: mapPlugin
        name: "osm"
    }

    Map{
        id: map
        anchors.fill:parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(0.5, 0.5)
        zoomLevel:50

        MapItemView{
            model: planner.uavModel
            delegate: MapCircle{
                id:uavPos
                radius: 2
                color:'black'
                border.width:3
                center: QtPositioning.coordinate(model.position.latitude, model.position.longitude)
            }
        }
    }
}

您应该在
地图
中使用
地图视图
而不是
中继器
中继器
不适用于随后添加元素的动态模型。@GrecKo谢谢。我没有意识到这种行为我怎么没想到?!谢谢,这很有效
import QtQuick 2.14
import QtQuick.Window 2.14
import QtLocation 5.14
import QtPositioning 5.14

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Plugin {
        id: mapPlugin
        name: "osm"
    }

    Map{
        id: map
        anchors.fill:parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(0.5, 0.5)
        zoomLevel:50

        MapItemView{
            model: planner.uavModel
            delegate: MapCircle{
                id:uavPos
                radius: 2
                color:'black'
                border.width:3
                center: QtPositioning.coordinate(model.position.latitude, model.position.longitude)
            }
        }
    }
}