使用Qt鼠标功能时'&'和'=='的区别?

Difference between '&' and '==' while using Qt mouse functions?

本文关键字:区别 Qt 鼠标 使用 功能      更新时间:2023-10-16

我正在阅读Qt"scrible"示例的文档。在那里,我偶然发现了以下代码:

 void ScribbleArea::mouseMoveEvent(QMouseEvent *event)
 {
     if ((event->buttons() & Qt::LeftButton) && scribbling)
         drawLineTo(event->pos());
 }
 void ScribbleArea::mouseReleaseEvent(QMouseEvent *event)
 {
     if (event->button() == Qt::LeftButton && scribbling) {
         drawLineTo(event->pos());
         scribbling = false;
     }
 }

我脑海中出现了一个问题,那就是event->button() == Qt::LeftButton(event->buttons() & Qt::LeftButton)之间是否真的有区别。你能解释一下吗?谢谢

逐位AND运算符(&)将第一个操作数的每个位与第二个操作数对应的位进行比较。

operator==比较两个操作数以查看值是否相等。

也就是说,对你来说:

event->buttons() & Qt::LeftButton

如果LeftButton位被设置并且其他位也可以被设置,则将为真

event->button() == Qt::LeftButton

如果仅设置了LeftButton位并且不应设置其他位,则为true


关于它如何工作的一个例子:

enum
{
    BUTTON_LEFT = 1 << 0,
    BUTTON_RIGHT= 1 << 1,
    BUTTON_MID  = 1 << 2
};
int a = 0;
a |= BUTTON_LEFT;
a |= BUTTON_RIGHT;
a |= BUTTON_MID;
if ( a & BUTTON_RIGHT )
    std::cout << "The button right is pressed." << std::endl;
if ( a == BUTTON_RIGHT )
    std::cout << "There is only the button right." << std::endl;

其输出为:The button right is pressed.。http://ideone.com/BunrTs

event->buttons() & Qt::LeftButton

如果LeftButton比特被设置,则这是真的;也可以设置其他比特。

event->button() == Qt::LeftButton

如果设置了LeftButton位,则为真;可以设置其他比特而不是

我觉得这是个bug。

假设鼠标按钮被表示为唯一的位"标志",第一个测试是否按下了鼠标左键,同时过滤掉可能同时按下的任何其他按钮。

然而,第二个要求只释放了左侧按钮。因此,如果你按两次开始涂鸦,然后同时释放两个按钮,它应该无法检测到释放。

更新

这个随机的Qt参考似乎支持这个假设,至少:

Qt::LeftButton    0x00000001 The left button is pressed, or an event refers to the left button. (The left button may be the right button on left-handed mice.)
Qt::RightButton   0x00000002 The right button.
Qt::MidButton     0x00000004 The middle button.

此外,正如出色的评论者@svk所指出的,两者使用不同的方式来访问鼠标按钮标志,所以应该没问题。

发布事件永远不会报告多个按钮,这是你在使用Qt一段时间后学到的东西之一,这是我没有做过的。很抱歉造成混乱。

请注意,在mouseMoveEvent方法的情况下,使用event->buttons()(它的末尾有"s"),并返回多个按钮的状态。因此,如果许多按钮被按下,就会设置许多标志。

mouseReleaseEventmousePressEvent的矛盾情况下,使用了event->button()方法(末尾没有"s"),并且返回哪个按钮调用该事件意味着只设置了一个标志,并且可以使用相等运算符。

当你注意到那张支票时,迈克·西摩已经拒绝了你的答复。

离题:在Qt标志中也有testFlag方法。