Qt6.8 QGraphicsView鼠标坐标点偏差

发布于:2024-12-08 ⋅ 阅读:(134) ⋅ 点赞:(0)

ui文件拖放QGraphicsView,src文件定义QGraphicsScene赋值给图形视图。

	this->scene = new QGraphicsScene();
	ui.graph->setScene(this->scene);

在这里插入图片描述
对graphicview过滤事件,只能在其viewport之后安装,否则不响应。

ui.graph->viewport()->installEventFilter(this);

分别对鼠标事件响应。

//事件过滤器
bool CarPos::eventFilter(QObject* obj, QEvent* event)
{
	//按下鼠标
	if (event->type() == QEvent::MouseButtonPress) {
		//显示橡皮筋
		_origin = pos_global(event);
		if (!rubberBand)
			rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
		rubberBand->setGeometry(QRect(_origin, QSize()));
		rubberBand->show();
	}
	//移动鼠标
	if (event->type() == QEvent::MouseMove) {		
		QPoint p = pos_global(event);
		rubberBand->setGeometry(QRect(_origin, p).normalized());
	}
	//释放鼠标
	if (event->type() == QEvent::MouseButtonRelease) {
		this->in_drawing = false;
	}

	return QMainWindow::eventFilter(obj, event);
}

要得到正确的橡皮筋图形,需要考虑点的坐标系转换。
在这里插入图片描述
在这里插入图片描述

//位置换算
QPoint CarPos::pos_global(QEvent* event)
{
	QMouseEvent* evt = static_cast<QMouseEvent*>(event);
	QPoint pt = evt->pos();
	//QPointF pt_f = ui.graph->mapTo(this, pt);
	QPointF pt_f = ui.graph->mapToParent(pt);
	return QPoint((int)pt_f.x(), (int)pt_f.y());
}

mapToParent是以QGraphicsView实例为父母级,会导致坐标向上高出10px(上下俩元素间隙)。应该用mapTo函数,this指向mainwindows。
在这里插入图片描述
弄清item之间的包含关系,能选择好坐标转换from或者to函数。
鼠标坐标点是QGraphicsView实例(ui.graph)的,橡皮筋坐标要正确,需要将坐标mapto到graph的父母级mainwindows,如果要得到graph内的场景scene坐标,则要mapToScene。

QPoint CarPos::pos_scene(QPoint pt)
{
	QPointF pt_f = ui.graph->mapToScene(pt);
	return QPoint((int)pt_f.x(), (int)pt_f.y());	
}

网站公告

今日签到

点亮在社区的每一天
去签到