在 C++ 中为 QML 创建一个中等复杂的绘图类

Posted

技术标签:

【中文标题】在 C++ 中为 QML 创建一个中等复杂的绘图类【英文标题】:Creating a moderatly complex plotting class in c++ for QML 【发布时间】:2018-03-30 10:00:59 【问题描述】:

我需要编写一个允许绘制 x 与 y 数据(散点图​​、线图)的类,并且应用程序是使用 QtQuick 完成的。应该可以显示多条曲线,并且可以根据用户选择动态添加。此外,对于共享 x 轴的不同数量的两个 y 轴应该是可能的。现在,我使用 QSGGeometryNode 将单条曲线绘制为 QQuickItem。我认为最终的绘图类应该包含这些曲线的向量以及轴和刻度,包括作为对象的标签。我想我会使用 QQuickPaintedItem 来绘制坐标轴和刻度。

但是,我对如何组织它有点迷茫(对 Qt 和 QML 不熟悉)。如果是小部件,我只会为轴创建子小部件并绘制曲线。 QtQuick 中是否有类似的可能?

【问题讨论】:

你看过qml图表模块doc.qt.io/qt-5.10/qtcharts-qmlmodule.html 是的,很遗憾我无法使用它,因为我们尝试使用 LGPL 许可证。 这些在 mit jwintz.me/blog/2014/02/15/… 下可用 【参考方案1】:

好的,实际上我不知道我可以像在小部件案例中一样创建子 QQuickItems。这意味着如果我有一个 PlotCurve 对象,它是一个 QQuickItem,我会创建一个像这样的 PlotWindow 对象

#ifndef PLOTWINDOW_H
#define PLOTWINDOW_H

#include <QQuickItem>
#include "plotcurve.h"

class PlotWindow : public QQuickItem

    Q_OBJECT
public:
    PlotWindow();

private:
    QVector<PlotCurve *> _curves;

signals:

public slots:
;

#endif // PLOTWINDOW_H

并将其添加到构造函数中(作为示例)

PlotWindow::PlotWindow()

    _curves.append(new PlotCurve(this));
    _curves[0]->setVisible(true);
    _curves[0]->setWidth(300);
    _curves[0]->setHeight(300);

我可以将轴作为 QQuickPaintedItem 并以类似的方式将它们添加到 PlotWindow 对象。

【讨论】:

您可以查看为 QWidget 编写的 QCustomPlot,但将其移植到 QtQuick 并不难。我自己做了。

以上是关于在 C++ 中为 QML 创建一个中等复杂的绘图类的主要内容,如果未能解决你的问题,请参考以下文章

Qml c++ 不同的委托 qt mvc

如何在 QML 中为矩形创建滚动条

C++ 成员变量类 Q_PROPERTY 在 QML 中不可用

从 C++ 设置创建的 qml 对象的父级不起作用

在 C++ 中为链表类创建实例

QML 未能检测到在 C++ 中破坏的 QObject