#ifndef MYLISTVIEW_H
#define MYLISTVIEW_H
#include <memory>
#include <QPoint>
#include <QList>
#include <QObject>
class MyListView : public QObject
{
Q_OBJECT
public:
MyListView();
static MyListView* getInstance();
int getMin() const;
void setMin(int min);
int getMax() const;
void setMax(int max);
//public slots:
//obj :QML中的LineSeries控件
Q_INVOKABLE void updateChart(QObject* obj);
private:
static std::unique_ptr<MyListView> m_pInstance;
int m_min = 0;
int m_max = 50;
Q_PROPERTY(int min MEMBER m_min)
Q_PROPERTY(int max MEMBER m_max)
};
#endif // MYLISTVIEW_H
```cpp
#include "mylistview.h"
#include <QVariant>
#include <QLineSeries>
#include <QtCharts/QLineSeries>
using namespace std;
using namespace QtCharts;
unique_ptr<MyListView> MyListView::m_pInstance(new MyListView);
MyListView::MyListView()
{
}
MyListView *MyListView::getInstance()
{
return m_pInstance.get();
}
int MyListView::getMin() const
{
return m_min;
}
void MyListView::setMin(int min)
{
m_min = min;
}
int MyListView::getMax() const
{
return m_max;
}
void MyListView::setMax(int max)
{
m_max = max;
}
id MyListView::updateChart(QObject *obj)
{
if(!obj)
return;
QVariant ret;
QMetaObject::invokeMethod(obj,"createSeries",
Q_RETURN_ARG(QVariant,ret));
QLineSeries *series = qvariant_cast<QLineSeries*>(ret);
series->append(0,0);
series->append(10,10);
series->append(20,20);
series->append(30,30);
}
``
在main.cpp中将C++单例类注册到QML中
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QApplication>
#include <mylistview.h>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
qmlRegisterSingletonType<MyListView>("MylistView.component",1,0,"MyChart",
[](QQmlEngine *engine, QJSEngine *jsEngine)
->QObject*{
return MyListView::getInstance();
});
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
```main.qml
在main.qml中使用C++函数给ChartView中的LineSeries添加数据
import QtQuick 2.12
import QtQuick.Window 2.12
import QtCharts 2.3
import QtQuick.Controls 2.5
import MylistView.component 1.0
Window {
id : root
visible: true
width: 640
height: 480
title: qsTr("Hello World")
property int min: MyChart.min
property int max: MyChart.max
//方式1通过QML信号与C++槽函数 QtObject是QObject的实例化
//QML中信号参数类型使用QtObject,C++中槽函数参数类型使用QObject
signal loadData(QtObject obj)
Component.onCompleted: {
//loadData.connect(MyChart.updateChart)
}
//方式2 :直接调用C++函数
//C++调用函数
function createSeries()
{
var series = chartView.createSeries(ChartView.SeriesTypeLine,"图表",
xAxis,yAxis)
return series
}
ChartView {
id : chartView
title: "Line"
anchors.fill: parent
antialiasing: true
}
ValueAxis{
id :xAxis
min : MyChart.min
max: MyChart.max
Component.onCompleted: {
console.log("min",MyChart.min)
console.log("max",MyChart.max)
}
}
ValueAxis{
id :yAxis
min : MyChart.min
max: MyChart.max
}
Button{
anchors.right: parent.right
anchors.rightMargin: 20
anchors.bottom: parent.bottom
anchors.bottomMargin: 20
onClicked: {
//loadData(root)
MyChart.updateChart(root)
}
}
}
QML与C++函数之间的相互调用,并将QML控件传给C++
于 2024-01-14 23:22:12 首次发布