代码之家  ›  专栏  ›  技术社区  ›  TrebledJ

QML BarSeries中的y轴最大值未更新

  •  0
  • TrebledJ  · 技术社区  · 5 年前

    QML BarSeries 显示某些数据并遇到问题:BarSeries的y轴不会自动更新。

    下面是从BarSeries文档中复制和修改的mcve。当用户单击背景时,它会更新条形图系列。

    //  main.qml
    
    import QtQuick 2.6
    import QtQuick.Window 2.2
    import QtCharts 2.2
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        ChartView {
            id: chartView
            title: "Bar series"
            anchors.fill: parent
            legend.alignment: Qt.AlignBottom
            antialiasing: true
    
            BarSeries {
                id: mySeries
                axisX: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] }
    
                BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] }
                BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] }
                BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] }
            }
    
        }
    
        MouseArea {
            anchors.fill: parent
            onClicked: {
                mySeries.clear();  //  clear previous sets
    
                //  update with new sets
                mySeries.append("Bob", [3, 5, 8, 13, 5, 8]);
                mySeries.append("Susan", [2, 2, 3, 4, 5, 200]);
                mySeries.append("James", [5, 1, 2, 4, 1, 7]);
    
            }
        }
    }
    

    从代码中,我们可以看到单击鼠标区域 应该 更新序列使y轴最大为200(由于Susan的新值集)。

    注意,我希望y轴最大值更新为200。 )

    :

    鼠标点击后 :

    要更新图表y轴的最大值,应该做哪些更改?

    多次之后 mySeries.append 陈述 MouseArea::onClicked ,我试着去做 chartView.update() 但这没用。

    我找了又找,但什么也没找到。大多数来自Web的答案只涉及QtTalk从C++运行或描述不同的问题(除非我用错误的关键字搜索)。


    为了完整起见,这里是 main.cpp 文件:

    #include <QApplication>
    #include <QQmlApplicationEngine>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QApplication app(argc, argv);  // needs QT += widgets in qmake
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        return app.exec();
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   TrebledJ    5 年前

    我可以通过附加一个自定义项来解决这个问题 ValueAxis ValueAxis::max 财产。

    import QtQuick 2.6
    import QtQuick.Window 2.2
    import QtCharts 2.2
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        ChartView {
            id: chartView
            title: "Bar series"
            anchors.fill: parent
            legend.alignment: Qt.AlignBottom
            antialiasing: true
    
            BarSeries {
                id: mySeries
                axisX: BarCategoryAxis { categories: ["2007", "2008", "2009", "2010", "2011", "2012" ] }
    
                axisY: ValueAxis {    //  <- custom ValueAxis attached to the y-axis
                    id: valueAxis
                }
    
                BarSet { label: "Bob"; values: [2, 2, 3, 4, 5, 6] }
                BarSet { label: "Susan"; values: [5, 1, 2, 4, 1, 7] }
                BarSet { label: "James"; values: [3, 5, 8, 13, 5, 8] }
            }
    
        }
    
        MouseArea {
            anchors.fill: parent
            onClicked: {
                mySeries.clear();
                mySeries.append("Bob", [3, 5, 8, 13, 5, 8]);
                mySeries.append("Susan", [2, 2, 3, 4, 5, 200]);
                mySeries.append("James", [5, 1, 2, 4, 1, 7]);
    
                valueAxis.max = 200;  //  hard-code a new maximum
            }
        }
    }
    

    这工作很出色。下面是点击背景后的图表:

    这里有一个动态计算新最大值的解决方案(只有 onClicked 为了简洁起见,显示了插槽):

    onClicked: {
        mySeries.clear();
        mySeries.append("Bob", [3, 5, 8, 13, 5, 8]);
        mySeries.append("Susan", [2, 2, 3, 4, 5, 200]);
        mySeries.append("James", [5, 1, 2, 4, 1, 7]);
    
        //  deduce the new min and max
        var min = 1e8, max = -1e8;
        for (var i = 0; i < mySeries.count; i++) {
            //  min = Math.min(min, ...mySeries.at(i).values);  //  modern js not yet supported?
            //  max = Math.min(max, ...mySeries.at(i).values);
    
            min = Math.min(min, mySeries.at(i).values.reduce(function(a,b) {
                return Math.min(a, b);
            }));
            max = Math.max(max, mySeries.at(i).values.reduce(function(a,b) {
                return Math.max(a, b);
            }));
        }
    
        //  set the new min and max
        valueAxis.min = min;
        valueAxis.max = max;
    
        // valueAxis.max = max * 0.05; // or give a little margin?
    
    }
    

    当然,最小值可以忽略不计,但这完全取决于您的数据和情况。