Qt图表:首要类解析
一、QChartView
QChartView 是 Qt Charts 模块中负责显示和交互的核心类。它继承自 QGraphicsView,这意味着它拥有 QGraphicsView 的所有强大功能,同时又专门为 QChart 进行了优化。
QChartView 的角色是图表的“视图”或“画布”。它连接了不可见的图表数据(QChart)和用户的视觉与操作。
QChart:是数据和图表元素的容器(模型)。QChartView:是将这个容器渲染到屏幕上,并处理用户输入(如缩放、平移)的窗口(视图)。
一个 QChart 可以被多个 QChartView 实例同时显示,每个视图可以有不同的缩放比例或视角。
1.1 主要成员函数解析
1. 构造函数与图表设置
QChartView(QChart *chart, QWidget *parent = nullptr)- 功能:创建一个
QChartView实例,并指定它要显示的QChart对象。这是最常用的构造函数。 - 示例:
QChartView *view = new QChartView(chart);
- 功能:创建一个
QChartView(QWidget *parent = nullptr)- 功能:创建一个空的
QChartView。之后需要通过setChart()来设置要显示的图表。
- 功能:创建一个空的
void setChart(QChart *chart)- 功能:设置或更换
QChartView所显示的图表。如果之前已经设置了图表,它会被替换掉。
- 功能:设置或更换
QChart *chart() const- 功能:返回当前
QChartView正在显示的图表指针。
- 功能:返回当前
2. 交互性设置 (关键功能)
这是 QChartView 区别于其他视图类的核心功能,它极大地增强了图表的用户体验。
void setInteractive(bool interactive)- 功能:设置图表是否为交互式。
true(默认): 启用所有交互功能,如鼠标悬停提示、点击、缩放和平移。false: 禁用所有用户交互,图表将变为静态图片。
- 功能:设置图表是否为交互式。
void setRubberBand(const RubberBands &rubberBands)- 功能:设置“橡皮筋”(Rubber Band)选择模式,用于框选缩放。
RubberBands是一个枚举类型。 - 常用值:
QChartView::NoRubberBand: 禁用橡皮筋选择(默认)。QChartView::HorizontalRubberBand: 允许水平方向的框选缩放。QChartView::VerticalRubberBand: 允许垂直方向的框选缩放。QChartView::RectangleRubberBand: 允许通过拖动鼠标形成一个矩形区域,将该区域缩放到整个视图。这是最常用的缩放方式。
- 示例:
view->setRubberBand(QChartView::RectangleRubberBand);
- 功能:设置“橡皮筋”(Rubber Band)选择模式,用于框选缩放。
void setDragMode(DragMode mode)- 功能:设置拖动模式,继承自
QGraphicsView。 - 常用值:
QGraphicsView::NoDrag: 禁用拖动(默认)。QGraphicsView::ScrollHandDrag: 当按下鼠标左键并拖动时,视图会平移(就像用手拖动一样)。这是实现平移功能的关键。
- 示例:
view->setDragMode(QGraphicsView::ScrollHandDrag);
- 功能:设置拖动模式,继承自
3. 视觉效果 (渲染设置)
这些函数用于提升图表的视觉质量。
void setRenderHint(QPainter::RenderHint hint, bool on = true)- 功能:设置渲染提示,继承自
QGraphicsView。这对于提升图表的视觉效果至关重要。 - 最重要的提示:
QPainter::Antialiasing: 抗锯齿。启用后,图表中的线条、文字和形状的边缘会变得非常平滑,消除了“锯齿”现象。强烈建议始终开启。
- 示例:
view->setRenderHint(QPainter::Antialiasing);
- 功能:设置渲染提示,继承自
void setBackgroundBrush(const QBrush &brush)- 功能:设置
QChartView整个控件区域的背景画刷。 - 示例:
view->setBackgroundBrush(Qt::darkGray);
- 功能:设置
void setForegroundBrush(const QBrush &brush)- 功能:设置
QChartView整个控件区域的前景画刷,它会覆盖在图表之上。可用于制作半透明的覆盖层。
- 功能:设置
4. 视图控制
这些函数用于在代码中控制视图的缩放和平移。
void zoomIn(qreal factor = 1.2)- 功能:放大视图。
factor是放大倍数,默认是 1.2 倍。
- 功能:放大视图。
void zoomOut(qreal factor = 1.2)- 功能:缩小视图。
factor是缩小倍数,默认是 1.2 倍。
- 功能:缩小视图。
void zoomReset()- 功能:将视图重置为初始状态,显示整个图表。
void scrollContentsBy(int dx, int dy)- 功能:平移视图。
dx和dy是水平和垂直方向的像素偏移量。
- 功能:平移视图。
5. 事件处理
由于 QChartView 是一个 QWidget,你可以重写它的事件处理函数来实现自定义的交互逻辑。
void wheelEvent(QWheelEvent *event) override- 功能:处理鼠标滚轮事件。你可以重写它来实现鼠标滚轮缩放功能。
- 示例:
void MyChartView::wheelEvent(QWheelEvent *event) { qreal factor = 1.1; if (event->delta() < 0) factor = 1.0 / factor; scale(factor, factor); event->accept(); }
void mousePressEvent(QMouseEvent *event) overridevoid mouseMoveEvent(QMouseEvent *event) overridevoid mouseReleaseEvent(QMouseEvent *event) override- 功能:处理鼠标按下、移动和释放事件。可用于实现复杂的自定义交互,如拖动数据点等。
1.2 常用成员函数速查表
| 功能类别 | 核心函数 |
|---|---|
| 基础设置 | setChart(), chart() |
| 交互控制 | setInteractive(), setRubberBand(), setDragMode() |
| 视觉效果 | setRenderHint() (特别是 Antialiasing) |
| 视图操作 | zoomIn(), zoomOut(), zoomReset(), scrollContentsBy() |
| 事件处理 | wheelEvent(), mousePressEvent() (用于自定义交互) |
1.3 总结
QChartView 是连接 QChart 和用户的桥梁。它不仅负责将图表美观地展示出来,更重要的是,它提供了一系列强大的函数来启用和管理用户交互,如缩放、平移和点击。
典型的工作流程是:
- 创建一个
QChart并向其中添加数据系列和坐标轴。 - 创建一个
QChartView,并将QChart对象传递给它。 - **(推荐)**调用
view->setRenderHint(QPainter::Antialiasing);来提升视觉效果。 - **(可选)**调用
view->setRubberBand(QChartView::RectangleRubberBand);和view->setDragMode(QGraphicsView::ScrollHandDrag);来启用用户缩放和平移功能。 - 将
QChartView设置为主窗口的中央部件或其他布局中进行显示。
二、Qchart
QChart 是 Qt Charts 模块的核心类,它负责管理和组织图表的所有元素,如数据系列、坐标轴、图例、标题等。
将 QChart 想象成一个图表画布或导演:
- 画布:它提供了一个区域,用于绘制所有图表元素。
- 导演:它负责指挥和组织各个“演员”(数据系列、坐标轴等),决定它们如何在“舞台”(图表区域)上呈现。
QChart 本身不直接处理用户交互,它主要负责数据的可视化呈现。用户交互(如缩放、平移)通常由 QChartView 处理。
QChart 是 Qt Charts 的中枢,它提供了一套全面的接口来构建和定制图表。
典型的工作流程是:
- 创建
QChart对象。 - 创建并配置数据系列(
QLineSeries等),并添加数据点。 - 使用
addSeries()将数据系列添加到图表。 - 创建并配置坐标轴(
QValueAxis等)。 - 使用
setAxisX()和setAxisY()将坐标轴与数据系列关联。 - (可选)设置标题、图例和背景等外观属性。
- 将
QChart对象设置到QChartView中进行显示。
2.1 主要成员函数解析
1. 数据系列管理 (Series Management)
这是 QChart 最核心的功能,用于添加、移除和管理数据。
void addSeries(QAbstractSeries *series)- 功能:向图表添加一个数据系列。
QAbstractSeries是所有数据系列的基类,具体可以是QLineSeries(折线图),QBarSeries(柱状图),QPieSeries(饼图) 等。 - 示例:
chart->addSeries(series);
- 功能:向图表添加一个数据系列。
void removeSeries(QAbstractSeries *series)- 功能:从图表中移除并删除指定的数据系列。
- 注意:调用此函数后,你不再需要手动
delete该series对象。
QList<QAbstractSeries *> series() const- 功能:返回图表中所有数据系列的列表。这在需要遍历所有系列进行操作(如统一设置颜色)时非常有用。
2. 坐标轴管理 (Axis Management)
坐标轴定义了数据的标尺。一个图表可以有多个坐标轴。
void addAxis(QAbstractAxis *axis, Qt::Alignment alignment)- 功能:向图表添加一个坐标轴,并指定其对齐方式。
alignment:可以是Qt::AlignLeft,Qt::AlignRight,Qt::AlignBottom,Qt::AlignTop。
- 示例:
chart->addAxis(axisX, Qt::AlignBottom);
- 功能:向图表添加一个坐标轴,并指定其对齐方式。
void removeAxis(QAbstractAxis *axis)- 功能:从图表中移除并删除指定的坐标轴。
QList<QAbstractAxis *> axes(Qt::Orientations orientation = Qt::Horizontal | Qt::Vertical, QAbstractSeries *series = nullptr) const- 功能:获取图表中的坐标轴。你可以通过
orientation(水平/垂直)和series(数据系列)来筛选。
- 功能:获取图表中的坐标轴。你可以通过
void setAxisX(QAbstractAxis *axis, QAbstractSeries *series)void setAxisY(QAbstractAxis *axis, QAbstractSeries *series)- 功能:将一个坐标轴与一个数据系列关联起来。这是最常用的坐标轴设置方法,它同时完成了“添加坐标轴到图表”和“将系列与坐标轴绑定”两个步骤。
- 示例:
QLineSeries *series = new QLineSeries(); QValueAxis *axisX = new QValueAxis(); QValueAxis *axisY = new QValueAxis(); chart->addSeries(series); chart->setAxisX(axisX, series); // 将 X 轴与 series 关联 chart->setAxisY(axisY, series); // 将 Y 轴与 series 关联
3. 标题和图例 (Title and Legend)
void setTitle(const QString &title)QString title() const- 功能:设置和获取图表的主标题。
QLegend *legend() const- 功能:获取图表的图例对象。通过这个指针,你可以进一步设置图例的位置、显示/隐藏等属性。
- 示例:
chart->legend()->setVisible(true); // 显示图例 chart->legend()->setAlignment(Qt::AlignBottom); // 将图例放在底部
4. 视图和交互 (View and Interaction)
void zoom(qreal factor)- 功能:按指定的
factor(缩放因子)缩放图表。factor > 1是放大,0 < factor < 1是缩小。
- 功能:按指定的
void zoomIn()/void zoomOut()- 功能:预设的放大和缩小操作。
void zoomReset()- 功能:将图表视图重置为初始状态。
void scroll(qreal dx, qreal dy)- 功能:平移图表。
dx是水平方向的偏移量,dy是垂直方向的偏移量。
- 功能:平移图表。
void setInteractive(bool interactive)- 功能:设置图表是否为交互式。如果为
false,则所有用户交互(如通过QChartView进行的缩放和平移)都将被禁用。
- 功能:设置图表是否为交互式。如果为
5. 布局和外观 (Layout and Appearance)
void setMargins(const QMargins &margins)QMargins margins() const- 功能:设置和获取图表内容区域与边框之间的边距。
void setBackgroundBrush(const QBrush &brush)- 功能:设置图表的背景画刷,可以是纯色、渐变或纹理。
- 示例:
chart->setBackgroundBrush(Qt::darkCyan);
void setBackgroundVisible(bool visible)- 功能:设置图表背景是否可见。
void setPlotAreaBackgroundBrush(const QBrush &brush)- 功能:设置绘图区域(即坐标轴包围的区域)的背景画刷。
- 示例:
chart->setPlotAreaBackgroundBrush(Qt::white);
void setPlotAreaBackgroundVisible(bool visible)- 功能:设置绘图区域背景是否可见。
6. 其他实用功能
QPixmap grab()- 功能:捕获当前图表的图像并返回一个
QPixmap。这对于将图表保存为图片文件非常有用。
- 功能:捕获当前图表的图像并返回一个
void render(QPainter *painter, const QRectF &target = QRectF(), const QRect &source = QRect(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)- 功能:将图表渲染到一个
QPainter上。这使得你可以将图表绘制到任何支持QPainter的设备上,如打印机 (QPrinter)、QImage或自定义的QWidget。
- 功能:将图表渲染到一个
2.2 信号函数
QChart 类本身提供了一些信号,用于通知外部对象图表内部状态发生了变化。这些信号对于实现交互性强的图表应用非常有用。
1. 主要信号函数解析
void clicked(const QPointF &point)
- 功能:当用户用鼠标单击图表的绘图区域(plot area)时,此信号被发射。
- 参数:
point是一个QPointF对象,包含了鼠标点击位置在图表坐标系中的坐标。 - 示例:
connect(chart, &QChart::clicked, [](const QPointF &point) { qDebug() << "图表被点击,坐标为 (x:" << point.x() << ", y:" << point.y() << ")"; });
void hovered(const QPointF &point, bool state)
- 功能:当用户的鼠标光标悬停在图表的绘图区域上时,此信号被发射。
- 参数:
point:鼠标光标在图表坐标系中的当前坐标。state:一个布尔值。当鼠标进入绘图区域时为true,当鼠标离开绘图区域时为false。
- 示例:
connect(chart, &QChart::hovered, [](const QPointF &point, bool state) { if (state) { qDebug() << "鼠标悬停在图表上,坐标为 (x:" << point.x() << ", y:" << point.y() << ")"; } else { qDebug() << "鼠标离开图表。"; } });
void pressed(const QPointF &point)
- 功能:当用户在图表的绘图区域上按下鼠标按键时,此信号被发射。
- 参数:
point是鼠标按下位置在图表坐标系中的坐标。
void released(const QPointF &point)
- 功能:当用户在图表的绘图区域上释放鼠标按键时,此信号被发射。
- 参数:
point是鼠标释放位置在图表坐标系中的坐标。
void doubleClicked(const QPointF &point)
- 功能:当用户用鼠标双击图表的绘图区域时,此信号被发射。
- 参数:
point是鼠标双击位置在图表坐标系中的坐标。
void updated()
- 功能:当图表的布局或数据发生变化,导致图表需要重新绘制时,此信号被发射。例如,添加/移除数据系列、修改坐标轴范围、缩放或平移图表后。
- 参数:无。
- 示例:可以用此信号来同步其他与图表状态相关的UI控件。
connect(chart, &QChart::updated, this, &MyWidget::onChartUpdated);
2. 重要说明:关于交互信号的来源
值得注意的是,QChart 的鼠标交互信号(如 clicked, hovered)默认是不发射的。为了让 QChart 能够接收到鼠标事件并发射这些信号,你需要通过它的“视图”——QChartView 来启用。
QChartView 继承自 QGraphicsView,它负责将 QChart 渲染到屏幕上,并处理用户的输入事件(如鼠标、键盘)。
如何启用交互信号?
在 QChartView 上调用 setInteractive(true),这会启用 QChartView 的默认交互行为,包括将鼠标事件传递给 QChart。
QChart *chart = new QChart();
// ... 向图表添加数据 ...
QChartView *chartView = new QChartView(chart);
// 关键步骤:启用交互性,这样 chart 才能收到鼠标事件并发射信号
chartView->setInteractive(true);
chartView->setRubberBand(QChartView::RectangleRubberBand); // 例如,启用矩形选择/缩放
// 现在可以安全地连接 QChart 的信号了
connect(chart, &QChart::clicked, [](const QPointF &point) {
qDebug() << "图表被点击了!" << point;
});
3. 信号对比总结
| 信号函数 | 触发时机 | 主要用途 |
|---|---|---|
clicked | 鼠标单击绘图区域 | 响应用户的点击操作,如显示数据详情、标记点等。 |
hovered | 鼠标悬停在绘图区域 | 实现鼠标跟随提示(Tooltip),显示当前鼠标位置的数据值。 |
pressed / released | 鼠标按下 / 释放 | 处理更复杂的鼠标交互,如拖动一个数据点。 |
doubleClicked | 鼠标双击绘图区域 | 实现双击放大、重置视图等功能。 |
updated | 图表需要重绘时 | 同步更新依赖于图表状态的其他UI元素,或执行与图表重绘相关的逻辑。 |
4. 如何获取数据点的点击信号?
QChart 的 clicked 信号只能告诉你点击了绘图区域的某个坐标,但不能直接告诉你点击了哪个数据点。要实现点击数据点的功能,你需要监听数据系列(QAbstractSeries) 自身的信号。
QAbstractSeries::clicked(const QPointF &point):当用户点击了该系列上的一个数据点时发射。point是该数据点在图表坐标系中的坐标。QAbstractSeries::hovered(const QPointF &point, bool state):当用户的鼠标悬停在该系列的一个数据点上时发射。
示例:
QLineSeries *series = new QLineSeries();
series->append(0, 6);
series->append(2, 4);
series->append(3, 8);
series->append(7, 4);
chart->addSeries(series);
// 连接到数据系列的 clicked 信号
connect(series, &QLineSeries::clicked, [series](const QPointF &point) {
// 找到被点击的数据点在系列中的索引
int index = series->points().indexOf(point);
if (index != -1) {
qDebug() << "点击了系列中的第" << index << "个数据点:" << point;
}
});
QChart 的信号是实现图表交互性的关键。通过连接 clicked 和 hovered 信号,你可以创建响应鼠标操作的动态图表。记住,这些交互信号的发射依赖于 QChartView 的交互设置。同时,如果你的目标是与特定的数据点交互,请优先考虑使用数据系列(QAbstractSeries)的信号。
2.3 常用成员函数速查表
| 功能类别 | 核心函数 |
|---|---|
| 数据系列 | addSeries(), removeSeries(), series() |
| 坐标轴 | setAxisX(), setAxisY(), addAxis(), removeAxis(), axes() |
| 标题图例 | setTitle(), legend() |
| 视图交互 | zoom(), scroll(), setInteractive() |
| 布局外观 | setMargins(), setBackgroundBrush(), setPlotAreaBackgroundBrush() |
| 输出 | grab(), render() |
三、QAbstractSeries
QAbstractSeries 是 Qt Charts 模块中所有数据系列的基类。它定义了所有数据系列(如 QLineSeries, QBarSeries, QPieSeries 等)共有的属性和行为。理解这个基类对于高效地操作和管理图表中的数据至关重要。
QAbstractSeries 可以被看作是图表中一组数据的抽象表示。它本身不能被直接实例化,你必须使用它的某个具体子类。这个类的主要作用是提供一个统一的接口,让你可以:
- 设置通用的外观属性(如颜色、可见性)。
- 管理与坐标轴的关联。
- 接收用户交互事件(如点击、悬停)。
QAbstractSeries 为所有数据系列提供了一个通用的蓝图。通过操作这个基类的指针,你可以编写更通用、更灵活的代码来管理图表中的多个不同类型的数据系列。
关键要点:
- 外观设置:使用
setName(),setPen(),setBrush()等函数来统一修改系列的视觉属性。 - 交互控制:使用
setPointsVisible(),setPointLabelsVisible()等函数来增强数据的可读性和交互性。 - 信号响应:连接
clicked()和hovered()信号来创建响应用户操作的动态图表。 - 类型判断:使用
type()函数可以在运行时确定系列的具体类型,从而执行特定操作。
3.1 主要成员函数详解
1. 外观和状态 (Appearance and State)
这些函数用于控制数据系列在图表中的视觉呈现。
void setName(const QString &name)/QString name() const- 功能:设置和获取数据系列的名称。这个名称会显示在**图例(
QLegend)**中,是识别不同数据系列的关键。 - 示例:
series->setName("月销售额");
- 功能:设置和获取数据系列的名称。这个名称会显示在**图例(
void setVisible(bool visible)/bool isVisible() const- 功能:设置和获取数据系列是否可见。这对于实现“显示/隐藏”某个数据系列的功能非常有用。
- 示例:
series->setVisible(false); // 隐藏该系列
void setOpacity(qreal opacity)/qreal opacity() const- 功能:设置和获取数据系列的透明度。
opacity的值在 0.0(完全透明)和 1.0(完全不透明)之间。 - 示例:
series->setOpacity(0.5); // 设置为半透明
- 功能:设置和获取数据系列的透明度。
void setPen(const QPen &pen)/QPen pen() const- 功能:设置和获取用于绘制系列轮廓的画笔(
QPen)。画笔可以定义线条的颜色、宽度、样式(实线、虚线等)。 - 注意:此函数对所有基于线条的系列(如
QLineSeries,QScatterSeries,QAreaSeries)有效,但对QPieSeries等没有线条轮廓的系列可能无效。
- 功能:设置和获取用于绘制系列轮廓的画笔(
void setBrush(const QBrush &brush)/QBrush brush() const- 功能:设置和获取用于填充系列内部区域的画刷(
QBrush)。画刷可以是纯色、渐变或纹理。 - 注意:此函数对
QAreaSeries(填充区域)、QBarSeries(填充柱子)、QPieSeries(填充扇形)等有效。
- 功能:设置和获取用于填充系列内部区域的画刷(
2. 交互性 (Interactivity)
这些函数用于控制数据系列是否能接收和响应用户的交互事件。
void setPointsVisible(bool visible)/bool pointsVisible() const- 功能:设置和获取数据系列的数据点是否以标记的形式(如圆点、方块)显示出来。
- 注意:此功能主要用于
QLineSeries和QScatterSeries。对于QBarSeries,它控制的是柱子顶部是否显示数据标签。
void setPointLabelsVisible(bool visible)/bool pointLabelsVisible() const- 功能:设置和获取是否在每个数据点旁边显示其数值标签。
- 示例:
series->setPointLabelsVisible(true);
void setPointLabelsFormat(const QString &format)/QString pointLabelsFormat() const- 功能:设置数据点标签的文本格式。
- 占位符:
@xPoint: 显示数据点的 X 值。@yPoint: 显示数据点的 Y 值。@seriesName: 显示数据系列的名称。
- 示例:
series->setPointLabelsFormat("(@xPoint, @yPoint)"); // 标签格式为 (x, y)
void setPointLabelsClipping(bool enabled)/bool pointLabelsClipping() const- 功能:设置当数据点标签超出图表边界时,是否进行裁剪。
3. 坐标轴关联 (Axis Association)
虽然通常通过 QChart::setAxisX() 和 QChart::setAxisY() 来关联坐标轴,但 QAbstractSeries 也提供了用于查询关联关系的函数。
QList<QAbstractAxis *> attachedAxes() const- 功能:返回一个列表,包含了所有与此数据系列关联的坐标轴。
bool attachAxis(QAbstractAxis *axis)- 功能:将一个坐标轴附加到数据系列上。通常不直接调用此函数,而是使用
QChart的方法,因为QChart需要管理坐标轴的显示。
- 功能:将一个坐标轴附加到数据系列上。通常不直接调用此函数,而是使用
bool detachAxis(QAbstractAxis *axis)- 功能:将一个坐标轴与此数据系列分离。
4. 数据获取 (Data Retrieval)
QChart *chart() const- 功能:返回此数据系列所属的
QChart对象。如果系列尚未添加到任何图表,则返回nullptr。
- 功能:返回此数据系列所属的
virtual QAbstractSeries::SeriesType type() const = 0- 功能:一个纯虚函数,返回系列的具体类型。这是一个枚举值(
QAbstractSeries::SeriesTypeLine,QAbstractSeries::SeriesTypeBar等),可以用来在不知道具体子类的情况下判断系列的类型。 - 示例:
if (series->type() == QAbstractSeries::SeriesTypeLine) { // 执行针对折线图的操作 }
- 功能:一个纯虚函数,返回系列的具体类型。这是一个枚举值(
3.2 主要信号 (Signals)
QAbstractSeries 提供了强大的交互信号,让你能够响应用户对特定数据点的操作。
void clicked(const QPointF &point)- 功能:当用户用鼠标单击此系列上的一个数据点时,此信号被发射。
- 参数:
point是被点击的数据点在图表坐标系中的坐标。 - 示例:
connect(series, &QLineSeries::clicked, [series](const QPointF &point) { int index = series->points().indexOf(point); if (index != -1) { qDebug() << "点击了第" << index << "个数据点:" << point; } });
void hovered(const QPointF &point, bool state)- 功能:当用户的鼠标光标悬停在此系列的一个数据点上时,此信号被发射。
- 参数:
point:鼠标光标下的数据点在图表坐标系中的坐标。state:true表示鼠标进入数据点,false表示鼠标离开数据点。
- 主要用途:实现鼠标悬停时显示数据提示框(Tooltip)。
void pressed(const QPointF &point)/void released(const QPointF &point)- 功能:当用户在数据点上按下或释放鼠标按键时发射。用于更复杂的交互,如拖动数据点。
void doubleClicked(const QPointF &point)- 功能:当用户双击数据点时发射。
浙公网安备 33010602011771号