我有一个View类,它是从QGraphicsView类重新实现的。
当我用右键单击鼠标时,我正在尝试绘制一条线。
这是我的mousePressEvent,mouseReleaseEvent和mouseMoveEvent代码:
View::View(QWidget *parent) : QGraphicsView(parent)
{
setAcceptDrops(true);
setDragMode(QGraphicsView::RubberBandDrag);
posFirst = QPoint(0,0);
setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
pressed = false;
area = new Area;
setScene(area);
selectionLine = new QGraphicsLineItem(0,0,0,0,0,area);
selectionLine->setPen(QPen(Qt::DashLine));
}
void View::mousePressEvent(QMouseEvent *event){
if(event->button() == Qt::RightButton ){
posFirst.setX( event->pos().x() );
posFirst.setY( event->pos().y() );
pressed = true;
selectionLine->setVisible(true);
}
QGraphicsView::mousePressEvent(event);
}
void View::mouseReleaseEvent(QMouseEvent *event){
update();
pressed = false;
selectionLine->setVisible(false);
event->accept();
selectionLine->setLine(0,0,0,0);
QGraphicsView::mouseReleaseEvent(event);
}
void View::mouseMoveEvent(QMouseEvent *event){
if(pressed ){
selectionLine->setLine(posFirst.x() , posFirst.y() , event->pos().x() , event->pos().y() );
}
QGraphicsView::mouseMoveEvent(event);
}
但是这段代码不能正常工作。它不能正确捕获鼠标重新发生事件和鼠标移动事件。 如果我设置if(event-> button()== Qt :: LeftButton),那么它按预期工作。
我也试过Qt :: MidButton并且它有效。
RightButton有什么问题?
答案 0 :(得分:3)
我认为问题出在图形视图的视口中。 QGraphicsView
在视口上渲染场景,视口也是一个QWidget(可能是一个OpenGL视口,或其他东西)。所以这个视口捕获并处理所有事件。
最好在场景中观看鼠标按键事件,而不是在视图上观看。视图仅显示场景的一部分,您必须将视图坐标转换为场景坐标才能正确创建一条线。
我还想避免对场景/视图进行子类化,而是创建一个在QObject::installEventFilter
场景中注册为事件过滤器的管理器对象。通过这种方式,您可以将不同的管理器插入到不同的场景中,而不需要继承。