用QScatterSeries绘制散点图,实现点击选中和取消选中的功能时出现的BUG

我开始懂了 2017-11-19 08:50:27
如题,我在用QScatterSeries绘制散点图时,想实现点击选中这个点,再次点击取消选中的功能,运行时出现异常,疑是出现空指针,但是实在不知道该咋改,求C++大神助力!代码和异常如下:

#include "millionpoints.h"
#include <QtCore/QtMath>

using namespace QtCharts;

MillionPoints::MillionPoints(QWidget *parent)
: QGraphicsView(parent)
{

series1 = new QScatterSeries();
series2 = new QScatterSeries();
series1->setName("scatter1");
series2->setName("scatter2");
series1->setMarkerShape(QScatterSeries::MarkerShapeCircle);
series1->setMarkerSize(15.0);
for(double i=0; i<100; i+=5)
{
series1->append(i,sin(i));
}

chart = new QChart();
chart->addSeries(series1);
chart->addSeries(series2);
chart->createDefaultAxes();
chart->axisX()->setRange(0,100);
chart->axisY()->setRange(-10,10);

scene = new QGraphicsScene();
scene->addItem(chart);
scene->setSceneRect(0, 0, 800, 500);
chart->setGeometry(0,0,800,500);
this->setWindowTitle("MillionPoints");
this->resize(900,600);
this->setScene(scene);

connect(series1,SIGNAL(clicked(QPointF)),this,SLOT(series1HandleClickedPoint(QPointF)));
connect(series2,SIGNAL(clicked(QPointF)),this,SLOT(series2HandleClickedPoint(QPointF)));
}

MillionPoints::~MillionPoints()
{

}

void MillionPoints::series1HandleClickedPoint(const QPointF &point)
{
QPointF clickedPoint = point;
if(series2->count()==0){
series1->remove(clickedPoint);
series2->append(clickedPoint);
qDebug()<<"--first click";
}else{
series1->append(series2->points());
series2->clear();
series2->append(clickedPoint);
series1->remove(clickedPoint);
qDebug()<<"--click another point";
}
}
void MillionPoints::series2HandleClickedPoint(const QPointF &point)
{
QPointF clickedPoint = point;
series1->append(clickedPoint);
series2->remove(clickedPoint);
qDebug()<<"--click last point";
}

好像是series2HandleClickedPoint方法里的series2->remove(clickedPoint);引起的异常,注掉就不会出现异常
...全文
1817 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AngryUmbrella 2018-12-12
  • 打赏
  • 举报
回复
我也碰到这个问题了。我猜是原来一个series中的点被移动到另一个之后,有一些原来的点的事件还没处理完,然后等到要处理这些事件的时候就找不到原来的对象了。于是GG。这个好像很无解啊。
我开始懂了 2017-11-20
  • 打赏
  • 举报
回复
引用 2 楼 ch122633 的回复:
对啊,指针使用有问题。。。 series2->remove(&clickedPoint) ???
貌似不行。。。clickedPoint定义的有点多此一举

void View::series2HandleClickedPoint(const QPointF &point){
    s->setFocusItem(s->c);
    series1->append(point);
    series2->remove(point);
    qDebug()<<"取消选中";
}
这样写也还是不行,异常 程序中断了
我开始懂了 2017-11-20
  • 打赏
  • 举报
回复
引用 3 楼 ch122633 的回复:
而且为什么加的是series1删除的却是series2 series1->append(clickedPoint); series2->remove(clickedPoint);
因为我想实现点击选中,再次点击取消的功能,就用了两个series(颜色不同,用来区别选中和未选中的状态) series1绘制出散点图,点击series1上的点就在series1HandleClickedPoint(const QPointF &point)方法中将点从series1中remove,在series2中append,实现选中的效果 然后在点击series2上的点就在series2HandleClickedPoint(const QPointF &point)方法中将点从series2中remove,在series1中append,实现取消选中的效果 这就是我的思路。。。可能代码逻辑有问题,出现了这样的异常
习惯就好zz 2017-11-20
  • 打赏
  • 举报
回复
而且为什么加的是series1删除的却是series2 series1->append(clickedPoint); series2->remove(clickedPoint);
习惯就好zz 2017-11-20
  • 打赏
  • 举报
回复
对啊,指针使用有问题。。。 series2->remove(&clickedPoint) ???
习惯就好zz 2017-11-20
  • 打赏
  • 举报
回复
引用 4 楼 m0_37935690 的回复:
[quote=引用 3 楼 ch122633 的回复:] 而且为什么加的是series1删除的却是series2 series1->append(clickedPoint); series2->remove(clickedPoint);
因为我想实现点击选中,再次点击取消的功能,就用了两个series(颜色不同,用来区别选中和未选中的状态) series1绘制出散点图,点击series1上的点就在series1HandleClickedPoint(const QPointF &point)方法中将点从series1中remove,在series2中append,实现选中的效果 然后在点击series2上的点就在series2HandleClickedPoint(const QPointF &point)方法中将点从series2中remove,在series1中append,实现取消选中的效果 这就是我的思路。。。可能代码逻辑有问题,出现了这样的异常[/quote] 那你是不是应该先试,在series1上实现一个点的增加和删除呢?
我开始懂了 2017-11-19
  • 打赏
  • 举报
回复
异常截图在这

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧