我正在阅读"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)之间是否实际上有任何区别。你能解释一下吗?谢谢。

最佳答案

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

operator==比较两个操作数以查看值是否相等。

也就是说,对您来说:

event->buttons() & Qt::LeftButton


如果LeftButton位置1,并且其他位置也可以设置,则为true。

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

09-06 20:26