gpt4 book ai didi

c++ - Qt:只有在没有拖放时才接受mouseRelease

转载 作者:行者123 更新时间:2023-11-28 05:58:29 24 4
gpt4 key购买 nike

我有一个 QGraphicsView 的子类,它应该接受两种鼠标事件:用于滚动的拖放和用于项目选择/突出显示的简单单击。所以我用

setDragMode(QGraphicsView::ScrollHandDrag);

启用用“手” ScrollView 。我有这样的功能:

void GraphView::mouseReleaseEvent(QMouseEvent* e)
{
if (e->button() == Qt::LeftButton)
emit leftClicked(mapToScene(e->pos()));
else
emit rightClicked(mapToScene(e->pos()));
QGraphicsView::mouseReleaseEvent(e);
}

只要用户点击场景,它就会创建信号。

但是,问题是:当我停止拖动并释放鼠标按钮时,将调用 mouseReleaseEvent 函数,如果光标恰好位于场景的某个元素上,它会高亮显示.如何更改 mouseReleaseEvent 函数,以便仅在之前没有拖动鼠标时才创建信号?

最佳答案

如果将 mousePress 和 mouseMove 与 mouseRelease 结合使用,则可以确定用户刚刚执行的鼠标操作。

如果您有 mousePress 然后是 mouseRelease,那么它一定是一个简单的点击。如果你有 mousePress、mouseMove,然后是 mouseRelease,那么它一定是拖动。

Qt 文档包含一个解释涂鸦程序中鼠标事件组合的示例。 http://doc.qt.io/qt-4.8/qt-widgets-scribble-example.html

你可以把这个原则扩展成这样:

private bool MyWidget::dragging = false;
private bool MyWidget::pressed = false;


void MyWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
pressed=true;
}
QGraphicsView::mousePressEvent(event)
}

void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
if ((event->buttons() & Qt::LeftButton) && pressed)
{
dragging=true;
}
QGraphicsView::mouseMoveEvent(event)
}

void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && pressed) {
pressed = false;
if (dragging)
{
dragging = false;
}
else
{
// plain mouse click
// do something here
}
}
QGraphicsView::mouseReleaseEvent(event)
}

请注意,这不会解决用户的鼠标操作仅部分在小部件内执行的边缘情况。我还必须承认,我对 Qt 比较陌生,还没有使用过 ScrollHandDrag,但这就是识别鼠标事件的特定组合的方式。

关于c++ - Qt:只有在没有拖放时才接受mouseRelease,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716528/

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