我正在阅读"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)
之间是否存在任何差异。你能解释一下吗?感谢。
答案 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 ”),则会返回多个按钮的状态。因此,如果许多按钮关闭,将设置许多标志。
在使用mouseReleaseEvent
和mousePressEvent
方法event->button()
的情况下使用(在结尾处没有“ s ”)并且返回哪个按钮调用时相反这个事件意味着只设置了一个标志,并且可以使用相等的运算符。
当您注意到Mike Seymour检查already excepted answer时。
偏离主题:在Qt标志中也有testFlag
method。