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());
}