QCustomPlot实现矩形缩放图表
意图
我们知道图表有些基本的功能,比如放大(ZoomIn)、缩小(ZoomOut)、拖拽(Drag)、恢复(1:1或ZoomReset)。这些功能QCustomPlot已经几乎都有了,但是选择矩形区域进行缩放的功能没有给出很好的接口,这可能就要我们自己实现了,这就是写这篇文章的目的。
实现
QCustomPlot本身有缩放的功能,但是没有实现矩形缩放的接口,所以实现的话无非是在图表上面实现鼠标选择的矩形区域,然后进行比例缩放。我们借助Qt自带的QRubberBand来实现矩形选择区域。看帮助文档和源码,我们可以看到当鼠标在图表区域上的时候,包括鼠标按下,移动,释放,这些动作会发送信号。
所以有两种方法实现:
- 我们只要以父控件实现槽函数来绑定这些信号来做特定处理就行了
- 实现QCustomPlot的子类,重载鼠标按下,移动,释放等鼠标事件函数
父控件槽函数实现方法
按照QCustomPlot提供的例子,我们写一个最简单的例子。
把QCustomPlot设为MainWindow的centralWidget。
少废话了,上源码吧:
MainWindow的头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QRubberBand>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void mousePress(QMouseEvent* mevent);
void mouseMove(QMouseEvent *mevent);
void mouseRelease(QMouseEvent *mevent);
void slotBtn();
private:
Ui::MainWindow *ui;
QRubberBand *rubberBand;
QPoint rubberOrigin;
};
#endif // MAINWINDOW_H
MainWindow的构造函数实现
//初始化QRubberBand
rubberBand = new QRubberBand(QRubberBand::Rectangle, ui->customPlot);
//从自带的例子中复制的代码
ui->customPlot->addGraph();
ui->customPlot->graph(0)->setPen(QPen(Qt::blue)); // line color blue for first graph
ui->customPlot->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 20))); // first graph will be filled with translucent blue
ui->customPlot->addGraph();
ui->customPlot->graph(1)->setPen(

3530

被折叠的 条评论
为什么被折叠?



