该示例显示了使用QRubberBand创建自定义的缩放效果,以及如何使用触摸手势进行平移和缩放。
图表缩放基于QChart类的zoom
、zoomIn
和zoomOut
实现。
自定义缩放效果
首先,我们创建一个包含一些示例数据的线系列。
代码语言:javascript复制QLineSeries *series = new QLineSeries();
for (int i = 0; i < 500; i ) {
QPointF p((qreal) i, qSin(M_PI / 50 * i) * 100);
p.ry() = QRandomGenerator::global()->bounded(20);
*series << p;
}
然后,我们通过从QChartView派生创建自定义图表视图:
代码语言:javascript复制class ChartView : public QChartView
我们重写覆盖了鼠标和按键的事件处理:
代码语言:javascript复制protected:
bool viewportEvent(QEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
然后,我们为鼠标和按键事件实现自定义逻辑。例如,按" "键将放大,而按"-"键将缩小。
代码语言:javascript复制void ChartView::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Plus:
chart()->zoomIn();
break;
case Qt::Key_Minus:
chart()->zoomOut();
break;
我们还创建了自己的QChart:
代码语言:javascript复制class Chart : public QChart
处理手势的代码:
代码语言:javascript复制bool Chart::sceneEvent(QEvent *event)
{
if (event->type() == QEvent::Gesture)
return gestureEvent(static_cast<QGestureEvent *>(event));
return QChart::event(event);
}
bool Chart::gestureEvent(QGestureEvent *event)
{
if (QGesture *gesture = event->gesture(Qt::PanGesture)) {
QPanGesture *pan = static_cast<QPanGesture *>(gesture);
QChart::scroll(-(pan->delta().x()), pan->delta().y());
}
if (QGesture *gesture = event->gesture(Qt::PinchGesture)) {
QPinchGesture *pinch = static_cast<QPinchGesture *>(gesture);
if (pinch->changeFlags() & QPinchGesture::ScaleFactorChanged)
QChart::zoom(pinch->scaleFactor());
}
return true;
}
需要注意的是,你将需要同时对QMainWindow和QChart调用grabGesture()。
关于更多
- 在QtCreator软件可以找到:
- 或在以下Qt安装目录找到:
C:Qt{你的Qt版本}Examples{你的Qt版本}chartszoomlinechart
- 相关链接
https://doc.qt.io/qt-5/qtcharts-zoomlinechart-example.html