QML与C++函数之间的相互调用,并将QML控件传给C++

1 篇文章 0 订阅
#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)
        }
    }
}


  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值