gpt4 book ai didi

c++ - Qt:实现平移(拖动)的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:42 25 4
gpt4 key购买 nike

QGraphicsview 有一个方法 setDragMode(ScrollHandDrag) 来启用鼠标左键的平移。但我想在单击鼠标滚轮(中间按钮)时启用平移,并创建了以下自定义实现来平移:

//Within a custom derived class of QGraphicsView
//pan is true when wheel is clicked and false when released
//last Pos is defined somewhere else in the class

void GridView::mouseMoveEvent(QMouseEvent *event){
if(pan){
QPointF currentPos = event->pos();
QPointF relPos = currentPos - lastPos;
lastPos = currentPos;

//this is what creates the panning effect
translate(relPos.x(), relPos.y());
}
QGraphicsView::mouseMoveEvent(event);
}

这在大多数情况下工作正常。但是,例如,如果我将单位矩阵缩放 1,000,000,此方法将失败并停止平移(就好像 View 卡住了一样)。当我使用 setDragMode()

时不会出现这个问题

setDragMode() 的正确自定义实现是什么,以便通过滚轮点击启用它?

最佳答案

这对我有用...它欺骗 Qt 以为用户按下鼠标左键,而实际上他按下的是鼠标左键。

void GridView :: mousePressEvent(QMouseEvent * e)
{
if (e->button() == MidButton)
{
QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers());
QGraphicsView::mousePressEvent(&fake);
}
else QGraphicsView::mousePressEvent(e);
}

void GridView :: mouseReleaseEvent(QMouseEvent * e)
{
if (e->button() == MidButton)
{
QMouseEvent fake(e->type(), e->pos(), LeftButton, LeftButton, e->modifiers());
QGraphicsView::mouseReleaseEvent(&fake);
}
else QGraphicsView::mouseReleaseEvent(e);
}

关于c++ - Qt:实现平移(拖动)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18551466/

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