实现QtCharts曲线图移动和缩放:

  1. 按住鼠标左键拖动曲线可移动曲线;
  2. 滚动鼠标滚轮实现图形X轴方向的缩放;
  3. 安装Ctrl,滚动鼠标滚轮实现图形Y轴方向的缩放;
  4. 按鼠标右键恢复图形初始状态;
  5. 缩放过程以鼠标当前位置为缩放中心;
  6. 鼠标移动过程中会在左上角显示当前坐标。

继承QChartView,主要重新实现鼠标事件和键盘事件。

  1. 移动图形利用QChart的scroll函数;
    void scroll(qreal dx, qreal dy, const QRectF &rect = QRectF());
    鼠标按下时,记录按下状态,并记录当前坐标位置,在移动事件内计算鼠标移动的距离,以此设置图形滚动的距离,即可实现移动
  2. 缩放则设置当前坐标轴的显示范围;
    void setRange(const QVariant &min, const QVariant &max);
void ChartView::mousePressEvent(QMouseEvent *event)
	if (event->button() == Qt::LeftButton) {
        prevPoint_ = event->pos();
        leftButtonPressed_ = true;
void ChartView::mouseMoveEvent(QMouseEvent *event)
	if (!coordItem_) {
		coordItem_ = new QGraphicsSimpleTextItem{ chart() };
		coordItem_->setZValue(5);
		coordItem_->setPos(100, 60);
		coordItem_->show();
	const QPoint curPos{ event->pos() };
	const QPointF curVal{ chart()->mapToValue(QPointF(curPos)) };
	coordItem_->setText(QString("X = %1, Y = %2").arg(curVal.x()).arg(curVal.y()));
	if (leftButtonPressed_) {
		const auto offset = curPos - prevPoint_;
		prevPoint_ = curPos;
		if (!alreadySaveRange_) {
			saveAxisRange();
			alreadySaveRange_ = true;
		chart()->scroll(-offset.x(), offset.y());
void ChartView::mouseReleaseEvent(QMouseEvent *event)
	leftButtonPressed_ = false;
	if (event->button() == Qt::RightButton) {
		if (alreadySaveRange_) {
            chart()->axisX()->setRange(xRange_[0], xRange_[1]);
            chart()->axisY()->setRange(yRange_[0], yRange_[1]);
void ChartView::wheelEvent(QWheelEvent *event)
#if (QT_VERSION <= QT_VERSION_CHECK(6,0,0))
   const auto pos  = QPointF(event->pos());
   const auto isZoomIn = event->delta() > 0;
#else
   const auto pos  = event->position();
   const auto isZoomIn = event->angleDelta().y() > 0;
#endif
   const QPointF curVal = chart()->mapToValue(pos);
   if (!alreadySaveRange_) {
   	saveAxisRange();
   	alreadySaveRange_ = true;
   auto zoom = [](QValueAxis* axis, double centre, bool zoomIn) {
   	constexpr auto scaling{ 1.5 };
   	const double down = axis->min();
   	const double up = axis->max();
   	double downOffset{};
   	double upOffset{};
   	if (zoomIn) {
   		downOffset = (centre - down) / scaling;
   		upOffset = (up - centre) / scaling;
   	else {
   		downOffset = (centre - down) * scaling;
   		upOffset = (up - centre) * scaling;
   	axis->setRange(centre - downOffset, centre + upOffset);
   if (ctrlPressed_) {
   	auto axis = qobject_cast<QValueAxis*>(chart()->axisY());
   	zoom(axis, curVal.y(), isZoomIn);
   } else {
   	auto axis = qobject_cast<QValueAxis*>(chart()->axisX());
   	zoom(axis, curVal.x(), isZoomIn);

完整代码和示例程序请在QtCharts图形移动和缩放Github下载。

功能实现QtCharts曲线图移动和缩放:按住鼠标左键拖动曲线可移动曲线;滚动鼠标滚轮实现图形X轴方向的缩放;安装Ctrl,滚动鼠标滚轮实现图形Y轴方向的缩放;按鼠标右键恢复图形初始状态;缩放过程以鼠标当前位置为缩放中心;鼠标移动过程中会在左上角显示当前坐标。实现继承QChartView,主要重新实现鼠标事件和键盘事件。移动图形利用QChart的scroll函数;voi...
整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 有竞争才会有进步,在第四次工业革命到来之际,随着物联网、人工智能、自动化、区块链、XR 等技术的逐渐成熟,底层工具篇中的编程语言界发生了怎样的变化?真实情况究竟如何? 近日,一月一更的 TIOBE 编程社区为我们揭晓了最新编程语言的现状。 在伊始之际,需要注意的是,TIOBE 编程语言排行榜是编程语言流行趋势的一个指标,这份排行榜排名基于全球技术工程师、课程和第三方供应商的数量,其中包括了流行的搜索引擎以及技术社区,如 Google、Bing、百度、维基百科、YouTube、CSDN 等等。具体的计算方式详见:https://www
文章目录前言基于 QChart 缩放的几种方式使用QChartView来缩放使用QChart来平移和缩放使用QValueAxis或者QDateTimeAxis来平移和缩放Qt曲线图表模块QChart库缩放、平移实例 最近使用Qt for python 做了一个图表,有个需求是用鼠标中轮,根据中轮的滚动来放大缩小显示的曲线,我这边用Qml实现的QChart图表, 当然QWidget的相应方法也会提到,都是一样的,相对于qml实现这个功能是真麻烦,得使用C++才能实现,而我又是使用的python,所以难度
void QChart::scroll(qreal dx, qreal dy) 按 dx 和 dy 指定的距离滚动图表的可见区域。对于极图表,dx 表示沿角轴而不是距离的角度。 QList<QAbstractAxis *> QChart::axes(Qt::Orientations orientation = Qt::Horizontal|Qt::Vertical, QAbstractSeries *series = nullptr) const 返回连接到 series的轴,并按 ..
原文链接:https://blog.csdn.net/kpengk/article/details/105800525 原博主写的特别好,我找了很久才找到这篇资源,直接复制就可以用,而且效果实现也很棒,在此感谢! 实现QtCharts曲线图移动缩放: 按住鼠标左键拖动曲线可移动曲线; 滚动鼠标滚轮实现图形X轴方向的缩放; 按住Ctrl,滚动鼠标滚轮实现图形Y轴方向的缩放; 按鼠标右键恢复图形初始状态; 缩放过程以鼠标当前位置为缩放中心; 鼠标移动过程中会在左上角显示当前坐标。 继承QCha
Banzy666: 更正一下函数 bool muxer::bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p) thread_local std::tuple<int,int,int> params{ 0, 0, 0 }; thread_local std::unique_ptr<SwsContext, decltype(&sws_freeContext)> sws_context{ nullptr, &sws_freeContext }; std::tuple<int,int,int> new_params{ width_, height_, av_image_get_linesize(AV_PIX_FMT_YUV420P, width_, 0) }; if (!sws_context || params != new_params) sws_context.reset(sws_getContext(width_, height_, AV_PIX_FMT_BGR24, width_, height_, AV_PIX_FMT_YUV420P, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr)); params = new_params; const int stride = std::get<2>(params); const uint8_t* src_data[1] = { buf_bgr }; int src_stride[1] = { width_ * 3 }; uint8_t* dst_data[3] = { buf_420p, buf_420p + y_size_, buf_420p + y_size_ + uv_size_ }; int dst_stride[3] = { stride, stride / 2, stride / 2 }; const int ret == sws_scale(sws_context.get(),src_data,src_stride,0, height_,dst_data,dst_stride); return ret >= 0; QtXlsx编译安装 蓝黑墨水: 确实可以,就是配置流程有点复杂 FFmpeg将图像数据编码为H264视频 kljsaydqw: 感谢分析,完美运行 QtCharts图形移动和缩放 花骨朵a: 没有pro文件 C++大量线程等待与唤醒 三十而学: 方式三共用锁和条件变量怎么防止cpu过高呢,实际上用notify one吗