使用qt,写一个widget,主函数里用qvariantlist生成一系列二维数组,采用quickwidget将这些数据传递至qml,在qml中map地图中用location画出这些数据点
时间: 2024-01-22 16:19:57 浏览: 23
好的,下面是一个实现的示例代码,你可以参考一下:
widget.h:
```cpp
#pragma once
#include <QWidget>
#include <QVariantList>
class QuickWidget;
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget* parent = nullptr);
private:
QuickWidget* quickWidget_;
QVariantList data_;
void generateData();
};
```
widget.cpp:
```cpp
#include "widget.h"
#include <QVBoxLayout>
#include <QQmlContext>
#include <QQuickItem>
#include <QQuickPaintedItem>
#include <QPainter>
#include <QDebug>
class MapItem : public QQuickPaintedItem {
public:
MapItem(QQuickItem* parent = nullptr) : QQuickPaintedItem(parent) {}
void paint(QPainter* painter) override {
painter->setRenderHint(QPainter::Antialiasing, true);
painter->setPen(QPen(Qt::red, 5));
for (const auto& point : points_) {
painter->drawPoint(point.toPointF());
}
}
void setPoints(const QVariantList& points) {
points_.clear();
for (const auto& point : points) {
points_ << QPointF(point.toList()[0].toDouble(), point.toList()[1].toDouble());
}
update();
}
private:
QList<QPointF> points_;
};
class QuickWidget : public ::QuickWidget {
public:
QuickWidget(QWidget* parent = nullptr) : ::QuickWidget(parent) {}
Q_INVOKABLE void setPoints(const QVariantList& points) {
auto item = rootObject()->findChild<MapItem*>("mapItem");
if (item) {
item->setPoints(points);
}
}
};
Widget::Widget(QWidget* parent) : QWidget(parent) {
generateData();
auto layout = new QVBoxLayout(this);
quickWidget_ = new QuickWidget(this);
layout->addWidget(quickWidget_);
quickWidget_->setResizeMode(QQuickWidget::SizeRootObjectToView);
quickWidget_->setSource(QUrl("qrc:/Map.qml"));
auto rootContext = quickWidget_->rootContext();
rootContext->setContextProperty("widget", this);
rootContext->setContextProperty("data", QVariant::fromValue(data_));
}
void Widget::generateData() {
for (int i = 0; i < 10; ++i) {
QVariantList points;
for (int j = 0; j < 10; ++j) {
points << QVariantList{ i + j * 0.1, j + i * 0.1 };
}
data_ << QVariant::fromValue(points);
}
}
```
Map.qml:
```qml
import QtQuick 2.12
import QtQuick.Controls 2.5
Item {
id: root
MapItem {
id: mapItem
anchors.fill: parent
}
Connections {
target: widget
onPointsChanged: mapItem.setPoints(points)
}
}
```
MapItem.qml:
```qml
import QtQuick 2.12
Rectangle {
width: 640
height: 480
Image {
id: mapImage
source: "qrc:/map.png"
width: parent.width
height: parent.height
fillMode: Image.PreserveAspectFit
}
}
```
上面的代码中,我们在 widget.cpp 中生成了一系列二维数组(即 QVariantList),然后将它们作为一个 QVariantList 传递给了 QML。在 QML 中,我们使用 MapItem 组件来在一个 Image 上绘制数据点。通过 Connections,我们可以在 widget 中监听 pointsChanged 信号,并将 points 传递给 QuickWidget,由它再将数据传递给 MapItem。在 MapItem 中,我们使用 QPainter 来绘制数据点。
需要注意的是,由于 QML 中的组件不是 QWidget,无法直接使用 C++ 的 signal/slot 机制来进行通信。因此,我们在 widget 中使用 Connections 来建立信号和槽的连接。同时,我们也需要在 C++ 中将 widget 和 data 注册到 QML 的上下文中,以供 QML 中的代码使用。