这个&运营商在这里意味着什么?

use*_*966 2 c++ bitwise-operators

我正在阅读有关qt中openGL的一些教程.其中一个鼠标事件槽中包含以下代码:

if (event->buttons() & Qt::LeftButton) {    
    rotationX += 180 * dy;
    rotationY += 180 * dx;
    updateGL();
}
Run Code Online (Sandbox Code Playgroud)

&运算符在if语句中做了什么?它和==完全一样吗?

zxc*_*cdw 5

它不一样==.它是按位AND运算符.表达式的作用是它接受返回值event->buttons()按位AND它的值由表示的值Qt::LeftButton.如果结果值不为零,则正在执行块.

实质上,它会检查指定的按钮Qt::LeftButton是否按下.

bitwise AND这里使用运算符的原因是称为位掩码.这意味着返回值event->buttons()只是一个值,它的位代表不同类型的状态.这里对&-operator执行的操作是检查Qt::LeftButton返回的值中是否设置了某些位(表示为)(1)或未设置(0)event->buttons().如果未设置测试位,则返回值为零;如果设置了至少一个测试位,则返回值为非零.

关于按位运算如何工作的更多细节可以在这里找到:维基百科关于按位运算的文章

  • 作为一个与==不同的实际例子,我想也有Qt :: RightButton,Qt :: MiddleButton等.这些都有不同的按位可组合值.Qt :: AnyMouseButton可能等于Qt :: RightButton | Qt :: LeftButton | Qt的:: MiddleButton.您可以执行位掩码操作以查看是否设置了这些组合.或者在原始问题的示例中,如果有多个与事件关联的按钮,您可以检查LeftButton是否已关闭,即使该事件也表明还按下了RightButton. (3认同)