是否可以像在 Qwt 中那样使用 QtCharts 创建滑动 x 轴?
Is it possible to create a sliding x-axis using QtCharts as done in Qwt?
我正在将一个使用 Qwt 绘图的项目迁移到 QtCharts。我开始测试 QtCharts,发现我无法像在 Qwt 中那样创建 "sliding" 的 x 轴。从文档中我无法看到以任何方式支持它。
有谁知道如何使用 Qt Charts 完成此操作?可能吗?如何从头开始创建这个?
我附上了两个视频,展示了这在 Qwt 中的样子以及到目前为止我在 QtCharts 中所做的事情。
QtCharts 示例的代码如下所示
import QtQuick 2.12
import QtCharts 2.3
import QtQuick.Controls 2.12
import QtQml 2.12
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Chart test")
ChartView {
id: chartView
readonly property var startDate: new Date('1995-12-17T03:20:00')
anchors.fill: parent
antialiasing: true
// The number of vertical tick lines to scroll to the right
function scrollTicksRight(ticks) {
chartView.scrollRight(axisX.tickDistance() * ticks)
}
Timer {
property real hz: 25
property real period: 1 / hz
property real periodMs: period * 1000
property int counter: 0
property real sinusStep: 0
function generateAndAppendPoint() {
let x = chartView.startDate.getTime() + counter
let y = 5 * Math.cos(sinusStep) + 5
splineSeries.append(x, y)
counter += periodMs
sinusStep += 0.1
if (x > axisX.max)
chartView.scrollRight(10)
}
interval: periodMs
running: true
repeat: true
onTriggered: generateAndAppendPoint()
}
SplineSeries {
id: splineSeries
name: "Example Series"
useOpenGL: true
function newestPoint() {
return splineSeries.at(splineSeries.count - 1)
}
axisX: DateTimeAxis {
id: axisX
// The distance between two vertical tick lines
function tickDistance() {
return (chartView.plotArea.width / (axisX.tickCount - 1))
}
// Remove points that are no longer visible
function removeOldPoints() {
let pointsToRemove = 0
let size = splineSeries.count
for (let i = 0; i < size; i++) {
if (splineSeries.at(i).x < min)
pointsToRemove++
else
break
}
splineSeries.removePoints(0, pointsToRemove)
}
tickCount: 11
format: "yyyy-MM-dd hh:mm:ss"
min: chartView.startDate
max: new Date(chartView.startDate.getTime() + 10000)
onMinChanged: removeOldPoints()
}
axisY: ValueAxis {
min: 0
max: 10
}
}
}
}
有可能。看看 dynamic spline example
轴在那里随着时间的推移而调整。
您可以通过 Qt Creator > 欢迎 > 示例找到它...
输入过滤器 "chart",您会在其他有趣的过滤器旁边找到它。
我正在将一个使用 Qwt 绘图的项目迁移到 QtCharts。我开始测试 QtCharts,发现我无法像在 Qwt 中那样创建 "sliding" 的 x 轴。从文档中我无法看到以任何方式支持它。
有谁知道如何使用 Qt Charts 完成此操作?可能吗?如何从头开始创建这个?
我附上了两个视频,展示了这在 Qwt 中的样子以及到目前为止我在 QtCharts 中所做的事情。
QtCharts 示例的代码如下所示
import QtQuick 2.12
import QtCharts 2.3
import QtQuick.Controls 2.12
import QtQml 2.12
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Chart test")
ChartView {
id: chartView
readonly property var startDate: new Date('1995-12-17T03:20:00')
anchors.fill: parent
antialiasing: true
// The number of vertical tick lines to scroll to the right
function scrollTicksRight(ticks) {
chartView.scrollRight(axisX.tickDistance() * ticks)
}
Timer {
property real hz: 25
property real period: 1 / hz
property real periodMs: period * 1000
property int counter: 0
property real sinusStep: 0
function generateAndAppendPoint() {
let x = chartView.startDate.getTime() + counter
let y = 5 * Math.cos(sinusStep) + 5
splineSeries.append(x, y)
counter += periodMs
sinusStep += 0.1
if (x > axisX.max)
chartView.scrollRight(10)
}
interval: periodMs
running: true
repeat: true
onTriggered: generateAndAppendPoint()
}
SplineSeries {
id: splineSeries
name: "Example Series"
useOpenGL: true
function newestPoint() {
return splineSeries.at(splineSeries.count - 1)
}
axisX: DateTimeAxis {
id: axisX
// The distance between two vertical tick lines
function tickDistance() {
return (chartView.plotArea.width / (axisX.tickCount - 1))
}
// Remove points that are no longer visible
function removeOldPoints() {
let pointsToRemove = 0
let size = splineSeries.count
for (let i = 0; i < size; i++) {
if (splineSeries.at(i).x < min)
pointsToRemove++
else
break
}
splineSeries.removePoints(0, pointsToRemove)
}
tickCount: 11
format: "yyyy-MM-dd hh:mm:ss"
min: chartView.startDate
max: new Date(chartView.startDate.getTime() + 10000)
onMinChanged: removeOldPoints()
}
axisY: ValueAxis {
min: 0
max: 10
}
}
}
}
有可能。看看 dynamic spline example 轴在那里随着时间的推移而调整。
您可以通过 Qt Creator > 欢迎 > 示例找到它... 输入过滤器 "chart",您会在其他有趣的过滤器旁边找到它。