C++ 与x27之间的差异&';和'==';在使用Qt鼠标功能时?
我正在阅读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
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)
将产生错误