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
从c+连接到QML图表+; 我有一个C++类,它收集数据(目前只是在上下阈值之间生成的随机数),并将其打包成qVoTF(qPoToF)。我有一个包含图表视图的QML文件。我想在我的QML CaltVIEW(LIsSeCures)中绘制收集的C++数据,并在每次C++中的数据收集功能完成时更新该图。我想把收集的QVoIP发送到一个辅助C++类来执行QML CaltVIEW更新。_C++_Qt_Qml - Fatal编程技术网

从c+连接到QML图表+; 我有一个C++类,它收集数据(目前只是在上下阈值之间生成的随机数),并将其打包成qVoTF(qPoToF)。我有一个包含图表视图的QML文件。我想在我的QML CaltVIEW(LIsSeCures)中绘制收集的C++数据,并在每次C++中的数据收集功能完成时更新该图。我想把收集的QVoIP发送到一个辅助C++类来执行QML CaltVIEW更新。

从c+连接到QML图表+; 我有一个C++类,它收集数据(目前只是在上下阈值之间生成的随机数),并将其打包成qVoTF(qPoToF)。我有一个包含图表视图的QML文件。我想在我的QML CaltVIEW(LIsSeCures)中绘制收集的C++数据,并在每次C++中的数据收集功能完成时更新该图。我想把收集的QVoIP发送到一个辅助C++类来执行QML CaltVIEW更新。,c++,qt,qml,C++,Qt,Qml,以下是各种相关文件的摘录 数据.h: #ifndef DATA_H #define DATA_H #include <QObject> #include <QTimer> #include <QtCore/QObject> #include <QAbstractSeries> #include <QXYSeries> class Data : public QObject { Q_OBJECT Q_PROPERTY

以下是各种相关文件的摘录

数据.h:

#ifndef DATA_H
#define DATA_H

#include <QObject>
#include <QTimer>
#include <QtCore/QObject>

#include <QAbstractSeries>
#include <QXYSeries>

class Data : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QVector<int> wVector READ wVector NOTIFY wVectorChanged)

public:
    Data();

    Q_PROPERTY(float wValue READ wValue NOTIFY wValueChanged)
    float wValue(){return this->m_wValue;}

    QVector<int> wVector(){return m_wVector;}

signals:
    void wValueChanged();
    void wVectorChanged();

private slots:
    void wTimeout();

public slots:

private:
    float    m_wValue;
    QTimer * m_wTimer;

    QVector<int> m_wVector;
    QList<QVector<QPointF> > m_data;

};

#endif // DATAD_H
我的问题:如何将chart.cpp连接到QML LineSeries以在QML图表视图中绘制chart.cpp数据(从data.cpp接收)


我使用的是Qt5.9.2。

没有必要使用C++中的系列(我认为没有必要使用图表类),数据可以直接更新,如下所示:

数据.h

#ifndef DATA_H
#define DATA_H

#include <QObject>
#include <QPointF>
#include <QTimer>

class Data : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QPointF wValue READ wValue NOTIFY wValueChanged)

public:
    Data(QObject *parent=Q_NULLPTR);
    QPointF wValue() const{
        return m_wValue;
    }
signals:
    void wValueChanged();
private slots:
    void wTimeout();
private:
    QTimer * m_wTimer;
    QPointF m_wValue;
};

#endif // DATA_H
main.cpp

#include "data.h"

void Data::wTimeout(){
    int HIGH = 100;
    int LOW = 0;
    int val = rand() % (HIGH - LOW + 1) + LOW;
    m_wValue.setX(m_wValue.x()+1);
    m_wValue.setY(val);
    emit wValueChanged();
}

Data::Data(QObject *parent):QObject(parent){
    m_wTimer = new QTimer(this);
    m_wTimer->setInterval((1000 / 5));
    connect(m_wTimer, &QTimer::timeout, this, &Data::wTimeout);
    m_wTimer->start();
}
#include "data.h"

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

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

    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("dataFromCpp", new Data());
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

完整的示例可以在下面找到。

与前面的问题有什么不同?嗨@eyllanesc!你之前的文章帮助很大,但它在main.cpp文件中使用了一个QQuickView,它与我现有的应用程序布局不一致。如您所见,我已经按照您昨天的建议/确认构建了一个QPointF QVector,并希望将其发送到外部.cpp(chart.cpp),并将该文件连接到QML,这与示波器示例中的QQuickView方法有很大不同。我认为chart类是不必要的,您可以直接发送和更新数据。QQuickView与问题无关。如果我能在data.cpp类中有一个函数直接更新图表,我很乐意这样做。我只是不理解您示波器文件中的mSeries QXYSeries组件;我看不到与QML LineSeries的连接在何处建立。使用setSeries时,您正在从QML传递第一个系列的指针:
dataSource.setSeries(chartView.series(0))如何修改上述内容,使其在data.cpp文件中而不是在头文件本身中包含逻辑(m_wTimer和wTimeout)?我很乐意删除CART.CPP/H文件,但是如果可能的话,我宁愿把逻辑从头文件中移开。只要把代码移到.CPP,我已经做了,现在别忘了把我的答案标记为正确。“EyLYNSEC出于兴趣,我可以用上面用C++编写的QXY系列的方法来替换吗?)整个图表数据集,而不是附加每个增量更改?我注意到QML线段不提供替换或添加QVAT/QLIST的方法,这只能从C++中得到。在这种情况下,我将使用第二个版本的代码来绘制整个向量/列表,而不是单独的点,因为我可以说这种灵活性非常有用。
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlEngine>
#include <QQmlContext>
#include <QQuickItem>
#include <thread>
#include <chrono>
#include <QDebug>
#include <time.h>
#include <iostream>
#include <typeinfo>
#include <QtCharts>
#include <QtQuick/QQuickView>

#include "data.h"
#include "hart.h"

using namespace std;
using namespace QtCharts;

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

    QQmlApplicationEngine engine;

    engine.rootContext()->setContextProperty(QStringLiteral("Data"), new Data());
    engine.rootContext()->setContextProperty(QStringLiteral("Chart"), new Chart());

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
import QtQuick 2.8
...
import QtCharts 2.2

//I've removed unnecessary QML elements for simplicity

ChartView {
    id: chartView
    width: parent.width
    height: parent.height
    anchors.fill: parent
    margins.bottom: 0
    margins.top: 0
    margins.left: 0
    margins.right: 0
    animationOptions: ChartView.NoAnimation
    antialiasing: true
    legend.visible: false
    backgroundColor: "#1f1f1f"

    ValueAxis {
        id: axisY1
        min: 0
        max: 100
        gridVisible: false
        color: "#ffffff"
        labelsColor: "#ffffff"
        labelFormat: "%.0f"
    }

    ValueAxis {
        id: axisX
        min: 0
        max: 50
        gridVisible: false
        color: "#ffffff"
        labelsColor: "#ffffff"
        labelFormat: "%.0f"
        tickCount: 5
    }

    LineSeries {
        id: lineSeries1
        name: "signal 1"
        color: "white"
        axisX: axisX
        axisY: axisY1
    }
}
#ifndef DATA_H
#define DATA_H

#include <QObject>
#include <QPointF>
#include <QTimer>

class Data : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QPointF wValue READ wValue NOTIFY wValueChanged)

public:
    Data(QObject *parent=Q_NULLPTR);
    QPointF wValue() const{
        return m_wValue;
    }
signals:
    void wValueChanged();
private slots:
    void wTimeout();
private:
    QTimer * m_wTimer;
    QPointF m_wValue;
};

#endif // DATA_H
#include "data.h"

void Data::wTimeout(){
    int HIGH = 100;
    int LOW = 0;
    int val = rand() % (HIGH - LOW + 1) + LOW;
    m_wValue.setX(m_wValue.x()+1);
    m_wValue.setY(val);
    emit wValueChanged();
}

Data::Data(QObject *parent):QObject(parent){
    m_wTimer = new QTimer(this);
    m_wTimer->setInterval((1000 / 5));
    connect(m_wTimer, &QTimer::timeout, this, &Data::wTimeout);
    m_wTimer->start();
}
#include "data.h"

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

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

    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("dataFromCpp", new Data());
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
import QtQuick 2.8
import QtCharts 2.2
import QtQuick.Window 2.2

Window{
    visible: true
    width: 640
    height: 480

    Connections {
        target: dataFromCpp
        onWValueChanged: {
            if(lineSeries1.count > 5)
                lineSeries1.remove(0);
            lineSeries1.append(dataFromCpp.wValue.x, dataFromCpp.wValue.y)
            axisX.min = lineSeries1.at(0).x
            axisX.max = lineSeries1.at(lineSeries1.count-1).x
        }
    }

    ChartView {
        id: chartView
        width: parent.width
        height: parent.height
        anchors.fill: parent
        animationOptions: ChartView.NoAnimation
        antialiasing: true
        backgroundColor: "#1f1f1f"

        ValueAxis {
            id: axisY1
            min: 0
            max: 100
            gridVisible: false
            color: "#ffffff"
            labelsColor: "#ffffff"
            labelFormat: "%.0f"
        }

        ValueAxis {
            id: axisX
            min: 0
            max: 50
            gridVisible: false
            color: "#ffffff"
            labelsColor: "#ffffff"
            labelFormat: "%.0f"
            tickCount: 5
        }

        LineSeries {
            id: lineSeries1
            name: "signal 1"
            color: "white"
            axisX: axisX
            axisY: axisY1
        }
    }
}