【发布时间】:2017-09-10 12:29:55
【问题描述】:
我是 qml 的新手,我还没有真正理解它的逻辑。
这是我的问题:我有一个带有条形图的图表视图,我希望当用户点击条形图时,条形图会发生变化。
所以我清除 barSeries 并将新数据附加到它。但它会导致分段错误。 如果我通过单击按钮进行相同的处理,则效果很好。 您知道问题出在哪里以及如何解决吗?
以下是代码示例。
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtCharts 2.2
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Chartview test")
Item {
id: histoView
property int globalForJs: 0
anchors.fill: parent
visible: true
Component.onCompleted: {
redraw();
}
signal redrawSignal()
ColumnLayout {
anchors.fill: parent
Button {
id:myBtn
anchors { top: parent.top; left: parent.left; leftMargin: 20 }
height: 30
width: 80
text: "new chart"
onClicked: {
console.debug("myBtn onClicked")
histoView.redrawSignal()
}
}
ChartView {
id: chartView
anchors { bottom: parent.bottom; left: parent.left; right: parent.right }
height: parent.height - 40
title: "chartview"
BarSeries {
id: mySeries
axisX: BarCategoryAxis { categories: [" "] }
axisY: ValueAxis {
id: ordinate
min:0
max:100
}
onClicked: {
console.debug("mySeries onClicked")
histoView.redrawSignal();
//myBtn.clicked()
}
}
}
}
function redraw() {
// clear data
mySeries.clear();
// add 5 new data
for (var i=0;i<5;i++) {
var tab=[];
globalForJs++;
tab.push(globalForJs);
mySeries.append("tutu"+i,tab);
}
// update Y axis maximum value
if (ordinate.max < globalForJs) {
ordinate.max = globalForJs + 10;
}
}
onRedrawSignal:redraw()
}
}
main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
}
【问题讨论】: