如何将VXYModelMapper与QStandardItemModel一起使用? [英] How to use the VXYModelMapper with QStandardItemModel?

查看:99
本文介绍了如何将VXYModelMapper与QStandardItemModel一起使用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想基于C ++中的模型向QML ChartView添加线和点.

在QML中,我执行了以下操作:

  ChartView {id:图表DateTimeAxis {id:axisX格式:"HH:mm:ss"分钟:新的Date()}ValueAxis {id:axisY最小值:0最多:200}VXYModelMapper {id:modelMapper型号:lineModel//C ++中的QStandardModel系列:线firstRow:1xColumn:1yColumn:2}} 

在C ++中,我执行了以下操作:

  lineModel =新的QStandardItemModel;静态const QHash<int,QByteArray>lineRoles {{0,"id"},{100,"x"},{101,"y"}};lineModel-> setItemRoleNames(lineRoles);QStandardItem * line =新的QStandardItem("Temp");lineModel-> appendRow(line);line-> setData(100,10);line-> setData(101,50); 

该点永远不会出现.是因为ChartView的xColumn和yColumn不正确吗?还是我将点添加到模型错误?

解决方案

在下面的链接中,您可以找到完整的示例.


PySide2:

  import os导入系统从PySide2导入QtCore,QtGui,QtWidgets,QtQml如果__name__ =='__main__':应用= QtWidgets.QApplication(sys.argv)lineModel = QtGui.QStandardItemModel(100,3)对于范围(lineModel.rowCount())中的行:item1 = QtGui.QStandardItem()item1.setData(row,QtCore.Qt.DisplayRole)时间= QtCore.QDateTime.currentDateTime().addSecs(行)item2 = QtGui.QStandardItem()item2.setData(time.toMSecsSinceEpoch(),QtCore.Qt.DisplayRole)item3 = QtGui.QStandardItem()item3.setData(row ** 2,QtCore.Qt.DisplayRole)lineModel.setItem(row,0,item1)lineModel.setItem(row,1,item2)lineModel.setItem(row,2,item3)引擎= QtQml.QQmlApplicationEngine();engine.rootContext().setContextProperty("lineModel",lineModel);engine.load(QtCore.QUrl.fromLocalFile(os.path.join(os.path.dirname(__ file__),"main.qml"))))如果不是engine.rootObjects():sye.exit(-1)sys.exit(app.exec_()) 

I want to add lines and points to a QML ChartView based on a model in C++.

In QML i did the following:

ChartView {
    id: chart

    DateTimeAxis {
        id: axisX
        format: "HH:mm:ss"
        min: new Date()
    }

    ValueAxis {
        id: axisY
        min: 0
        max: 200
    }

    VXYModelMapper {
        id: modelMapper
        model: lineModel // QStandardModel in C++
        series: line
        firstRow: 1
        xColumn: 1 
        yColumn: 2
    }
}

In C++ i did the following:

lineModel = new QStandardItemModel;
static const QHash< int, QByteArray > lineRoles {
    { 0, "id" },
    { 100, "x" },
    { 101, "y" }
};
lineModel->setItemRoleNames( lineRoles );

QStandardItem *line = new QStandardItem("Temp");
lineModel->appendRow(line);
line->setData(100, 10);
line->setData(101, 50);

The point never shows up. Is it because the xColumn and the yColumn of the ChartView are not right? Or do i add the point to the model wrong?

解决方案

VXYModelMapper requires that the model have several columns, for example in your case you set the property xColumn: 1 indicating that it is the second column and yColumn: 2 which is the third column, but your model only has one column(the index start at 0 in the models.).

An example:

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QStandardItemModel>
#include <QDateTime>

int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QApplication app(argc, argv);

    QStandardItemModel lineModel(100, 3);// 100 rows and 3 columns

    for (int row = 0; row < lineModel.rowCount(); row++) {
        QStandardItem *item1 = new QStandardItem(QString::number(row));
        QDateTime time = QDateTime::currentDateTime().addSecs(row);
        QStandardItem *item2 = new QStandardItem(QString::number(time.toMSecsSinceEpoch()));
        QStandardItem *item3 = new QStandardItem(QString::number(row*row));
        lineModel.setItem(row, 0, item1);
        lineModel.setItem(row, 1, item2);
        lineModel.setItem(row, 2, item3);
    }

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

    return app.exec();
}

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtCharts 2.2

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

    ChartView {
        anchors.fill: parent
        id: chart

        DateTimeAxis {
            id: axisX
            format: "HH:mm:ss"
        }

        ValueAxis {
            id: axisY
            min: 0
            max: 10000
        }

        LineSeries{
            id: line
            axisX: axisX
            axisY: axisY
        }

        VXYModelMapper {
            id: modelMapper
            model: lineModel // QStandardModel in C++
            series: line
            firstRow: 1
            xColumn: 1
            yColumn: 2
        }
    }
}

In the following link you can find the complete example.


PySide2:

import os
import sys
from PySide2 import QtCore, QtGui, QtWidgets, QtQml

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    lineModel = QtGui.QStandardItemModel(100, 3)

    for row in range(lineModel.rowCount()):
        item1 = QtGui.QStandardItem()
        item1.setData(row, QtCore.Qt.DisplayRole)
        time = QtCore.QDateTime.currentDateTime().addSecs(row)
        item2 = QtGui.QStandardItem()
        item2.setData(time.toMSecsSinceEpoch(), QtCore.Qt.DisplayRole)
        item3 = QtGui.QStandardItem()
        item3.setData(row**2, QtCore.Qt.DisplayRole)
        lineModel.setItem(row, 0, item1)
        lineModel.setItem(row, 1, item2)
        lineModel.setItem(row, 2, item3)

    engine = QtQml.QQmlApplicationEngine() ;
    engine.rootContext().setContextProperty("lineModel", lineModel);
    engine.load(QtCore.QUrl.fromLocalFile(os.path.join(os.path.dirname(__file__), "main.qml")))
    if not engine.rootObjects():
        sye.exit(-1)
    sys.exit(app.exec_())

这篇关于如何将VXYModelMapper与QStandardItemModel一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆