gpt4 book ai didi

qt - QGraphicsView右键鼠标按下事件问题

转载 作者:行者123 更新时间:2023-12-04 06:35:06 25 4
gpt4 key购买 nike

我有一个从 QGraphicsView 类重新实现的 View 类。

当用右键单击鼠标时,我试图画一条线。

这是我的 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 有什么问题?

最佳答案

我认为问题出在图形 View 的视口(viewport)中。 QGraphicsView在视口(viewport)上渲染场景,它也是一个 QWidget(它可能是一个 OpenGL 视口(viewport),或其他东西)。所以这个视口(viewport)捕获并处理所有事件。

您最好在现场而不是 View 上观察鼠标按下事件。 View 仅显示场景的一部分,您必须将 View 坐标转换为场景坐标才能正确创建一条线。

我还想避免子类化场景/ View ,而是创建一个管理器对象,该对象在场景中注册为事件过滤器,使用 QObject::installEventFilter .这样你就可以将不同的管理器插入到不同的场景中,而不必为继承而烦恼。

关于qt - QGraphicsView右键鼠标按下事件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4951921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com