使用Qt鼠标功能时'&'和'=='的区别?
Difference between '&' and '==' while using Qt mouse functions?
我正在阅读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"),并返回多个按钮的状态。因此,如果许多按钮被按下,就会设置许多标志。
在mouseReleaseEvent
和mousePressEvent
的矛盾情况下,使用了event->button()
方法(末尾没有"s"),并且返回哪个按钮调用该事件意味着只设置了一个标志,并且可以使用相等运算符。
当你注意到那张支票时,迈克·西摩已经拒绝了你的答复。
离题:在Qt标志中也有testFlag
方法。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- int(c) 和 c-'0' 之间的区别。C++
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- Qt:remove() 和 rmdir() 有什么区别
- 将静态库链接行添加到我的QT项目文件没有区别
- Qt样式表和QML有什么区别
- QT创建者和QT(只是其本身)的区别-启动QT
- Qt的MinGW,Code::Blocks的MinGW和MinGW本身有什么区别吗?
- 使用Qt鼠标功能时'&'和'=='的区别?
- QT创建者和设计器的区别-开始QT