qt散点图中,手动随意画线框选,筛选出圈内的点
时间: 2023-07-13 11:10:50 浏览: 122
在Qt散点图中,您可以使用QPainter和QPaintEvent类来手动绘制选择框。具体步骤如下:
1. 在散点图上按下鼠标左键时,记录下鼠标按下的坐标。
2. 随着鼠标的移动,使用QPainter在散点图上绘制一个矩形或椭圆形,表示选择框。
3. 在鼠标释放时,记录下鼠标释放的坐标。
4. 遍历所有的散点,判断散点是否在选择框内,如果在,就将其标记为选中状态。
5. 根据选中状态,重新绘制散点图,将选中的散点用不同的颜色或符号表示出来。
以下是一个示例代码,其中假设散点数据存储在QVector<QPointF>类型的变量m_points中:
```cpp
void ScatterPlot::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_selectionStart = event->pos();
m_selectionEnd = m_selectionStart;
}
}
void ScatterPlot::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
m_selectionEnd = event->pos();
update(); // 重绘散点图
}
}
void ScatterPlot::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_selectionEnd = event->pos();
selectPoints(); // 筛选出圈内的点
}
}
void ScatterPlot::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制散点图
for (const QPointF& point : m_points) {
painter.drawEllipse(point, 3, 3);
}
// 绘制选择框
if (m_selectionStart != m_selectionEnd) {
QRectF selectionRect = QRectF(m_selectionStart, m_selectionEnd).normalized();
painter.setPen(Qt::DotLine);
painter.setBrush(Qt::NoBrush);
painter.drawRect(selectionRect);
}
}
void ScatterPlot::selectPoints()
{
QRectF selectionRect = QRectF(m_selectionStart, m_selectionEnd).normalized();
QVector<bool> selected(m_points.size(), false);
for (int i = 0; i < m_points.size(); i++) {
if (selectionRect.contains(m_points[i])) {
selected[i] = true;
}
}
// 将选中的散点标记为不同的颜色
for (int i = 0; i < m_points.size(); i++) {
if (selected[i]) {
m_selectedPoints.append(m_points[i]);
}
}
update(); // 重绘散点图
}
```
请注意,上述代码仅提供了基本的实现方法,您可以根据自己的需求对其进行修改和扩展。
阅读全文