0

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

 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

4 回答 4

3

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

比较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

于 2013-08-30T08:16:46.273 回答
1
event->buttons() & Qt::LeftButton

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

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

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

于 2013-08-30T08:15:03.673 回答
0

对我来说似乎是一个错误。

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

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

更新

这个随机的 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 一段时间后学到的东西之一,这是我没有做过的事情。对困惑感到抱歉。

于 2013-08-30T08:15:09.207 回答
0

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

mouseReleaseEvent与使用andmousePressEvent方法的情况相反event->button()(最后没有“ s ”),并且返回哪个按钮调用此事件,这意味着只设置了 ONE 标志并且可以使用等于运算符。

当您注意到Mike Seymour 的已排除答案时。

题外话:在 Qt 中,标志也有testFlagmethod

于 2013-08-30T10:11:56.990 回答