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

时间:2013-08-30 08:11:36

标签: c++ qt

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

 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)之间是否存在任何差异。你能解释一下吗?感谢。

4 个答案:

答案 0 :(得分:3)

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

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

也就是说,对你:

event->buttons() & Qt::LeftButton

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

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

如果仅设置LeftButton位且不应设置其他位,则为真。


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

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

答案 1 :(得分:1)

event->buttons() & Qt::LeftButton

如果LeftButton位置位,则为true;其他位也可以设置。

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

如果设置LeftButton位,则为true;其他位可能被设置。

答案 2 :(得分:0)

对我来说看起来像个错误。

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

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

<强>更新

This random Qt reference似乎支持这一假设,至少:

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一段时间后学到的事情之一,这是我没有做过的事情。对不起,感到困惑。

答案 3 :(得分:0)

请注意,如果使用mouseMoveEvent方法event->buttons()(结尾处有“ s ”),则会返回多个按钮的状态。因此,如果许多按钮关闭,将设置许多标志。

在使用mouseReleaseEventmousePressEvent方法event->button()的情况下使用(在结尾处没有“ s ”)并且返回哪个按钮调用时相反这个事件意味着只设置了一个标志,并且可以使用相等的运算符。

当您注意到Mike Seymour检查already excepted answer时。

偏离主题:在Qt标志中也有testFlag method