C++ 与x27之间的差异&';和'==';在使用Qt鼠标功能时?

C++ 与x27之间的差异&';和'==';在使用Qt鼠标功能时?,c++,qt,C++,Qt,我正在阅读Qt示例的文档。在那里,我偶然发现了以下代码: void ScribbleArea::mouseMoveEvent(QMouseEvent *event) { if ((event->buttons() & Qt::LeftButton) && scribbling) drawLineTo(event->pos()); } void ScribbleArea::mouseReleaseEvent(QMouseEv

我正在阅读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;
     }
 }
有一个问题在我脑海中浮现,那就是
事件->按钮()==Qt::LeftButton
(事件->按钮()&Qt::LeftButton)
之间是否真的有任何区别。你能解释一下吗?谢谢

event->buttons() & Qt::LeftButton
如果设置了
LeftButton
位,则为真;还可以设置其他位

event->button() == Qt::LeftButton
如果仅设置了
LeftButton
位,则为真;不能设置其他位

如果设置了
LeftButton
位,则为真;还可以设置其他位

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

如果仅设置了
LeftButton
位,则为真;其他位可能无法设置。

在我看来像个bug

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

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

更新

似乎支持这一假设,至少:

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.
另外,正如brilliant commentor所指出的,这两种方法使用不同的方式来访问鼠标按钮标志,所以应该可以


发布事件从不报告多个按钮这一事实是您在使用Qt一段时间后了解到的事情之一,这是我没有做过的事情。抱歉搞混了。

对我来说像个bug

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

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

更新

似乎支持这一假设,至少:

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.
另外,正如brilliant commentor所指出的,这两种方法使用不同的方式来访问鼠标按钮标志,所以应该可以

发布事件从不报告多个按钮这一事实是您在使用Qt一段时间后了解到的事情之一,这是我没有做过的事情。抱歉造成混淆。

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

运算符==
比较两个操作数以查看值是否相等

也就是说,对你来说:

event->buttons() & Qt::LeftButton
如果设置了
LeftButton
位,则为真,并且还可以设置其他位。

event->button() == Qt::LeftButton
如果仅设置了
LeftButton
位,而不应设置其他位,则为真。

event->button() == Qt::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;
enum
{
按钮_LEFT=1按位AND运算符(&)将第一个操作数的每一位与第二个操作数的对应位进行比较

运算符==
比较两个操作数以查看值是否相等

也就是说,对你来说:

event->buttons() & Qt::LeftButton
如果设置了
LeftButton
位,则为真,并且还可以设置其他位。

event->button() == Qt::LeftButton
如果仅设置了
LeftButton
位,而不应设置其他位,则为真。

event->button() == Qt::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;
enum
{

BUTTON_LEFT=1请注意,如果使用了
mouseMoveEvent
方法
event->buttons()
(它在末尾有“s”),它返回多个按钮的状态。因此,如果许多按钮关闭,将设置许多标志

在使用
mouseReleaseEvent
MousePresseEvent
方法
event->button()
的情况下(末尾没有“s”),此返回哪个按钮调用此事件,这意味着只设置了一个标志,并且可以使用equal运算符

当你注意到迈克·西摩的支票时


离题:在Qt中,标志也有。

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

在使用
mouseReleaseEvent
MousePresseEvent
方法
event->button()
的情况下(末尾没有“s”),此返回哪个按钮调用此事件,这意味着只设置了一个标志,并且可以使用equal运算符

当你注意到迈克·西摩的支票时


题外话:在Qt标志中也有。

我对Qt不太熟悉,但可能它(事件->按钮()&Qt::LeftButton)也会选中右按钮……我对Qt不太熟悉,但可能它是(事件->按钮()&Qt::LeftButton)还将检查右键…不确定这是否是错误。请注意,有两种不同的方法:
button()
buttons()
。对于鼠标释放事件,只有一个按钮被释放。@svk谢谢!这很奇怪,您的评论是最好的答案。我发现,
button()
buttons()
在发布时始终为0。不知道这是否是一个错误。不确定这是否是一个错误。请注意,有两种不同的方法:
按钮()
按钮()
。对于鼠标释放事件,只有一个按钮被释放。@svk谢谢!这很奇怪,您的评论是最好的答案。我发现,
按钮()
按钮()
在发布时始终为0。不知道这是否是一个bug。因此,代码
((事件->按钮()&Qt::LeftButton)和&scribbling)
(事件->按钮()==Qt::LeftButton&&scribbling)
将产生错误