2012-06-22 68 views
2

我正在閱讀一些關於qt中openGL的教程。 鼠標事件槽的一個具有此代碼是:這和操作符在這裏表示什麼?

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

什麼是&操作if語句呢? 和==完全一樣嗎?

回答

5

它與==不一樣。它是按位運算符AND。表達式的作用是它將event->buttons()的返回值按位與和的值與Qt::LeftButton代表的值相比較。如果結果值不爲零,則塊正在執行。

實質上,它檢查按鈕Qt::LeftButton指定的按鈕是否被按下。

此處使用bitwise AND運算符的原因是所謂的位掩碼。這意味着event->buttons()的返回值只是一個值,它的位代表不同的狀態。 & -operator在這裏完成的是,它檢查在由event->buttons()返回的值中是否設置了(1)或未設置(0)某些位(由Qt::LeftButton表示)。如果未設置測試位,則返回值爲零;如果至少有一個測試位置位,則返回值爲非零值。的操作如何按位工作

更多細節可以在這裏找到:Wikipedia article about Bitwise operations

+3

作爲與==不同的一個實際例子,我想還有Qt :: RightButton,Qt :: MiddleButton等。這些都會有不同的按位可組合的值。 Qt :: AnyMouseButton可能等於Qt :: RightButton | Qt :: LeftButton | Qt的:: MiddleButton。您可以執行位掩碼操作以查看是否設置了這些操作的組合。或者在原始問題的示例中,如果有多個按鈕與事件關聯,則可以檢查LeftButton是否已關閉,即使該事件也指示RightButton也被按下。 –

+0

非常感謝!這是非常豐富的!因此,如果我使用==而不是&here,它會執行與&相同的工作嗎?還是隻是返回false,因爲按位它們不一樣?抱歉沒關係,我知道了〜 – user1475966

0

這是位AND運算符。

0011 
& 0101 
------ 
    0001 
0

event->buttons()想必返回一個值,該值是比特的組合,其中每一位表示一個按鈕。 Qt::LeftButton將會是一個值,可能只有一個位設置在對應於「左鍵」的位置。在這裏使用按位AND(&)與這兩個值的各個位進行比較,如果結果不爲零,則該條件將被視爲真。

由於Qt::LeftButton中只有一位,獲得非零值的唯一方法是event->buttons()具有相同的位集。 (它也可以設置其他位,但是當它們與Qt::LeftButton中的那些位置的零位進行AND操作時,這些位將消失。實際上,當且僅當event->buttons()包括由Qt::LeftButton代表的位時,表達式意味着「真」。

2

這將測試該值事件=>按鈕()具有比特的Qt :: LeftButton。

其結果將是0,如果它沒有該位。和一個Qt :: LeftButton如果它確實包括位。

它是檢查標誌或比特值的存在對多個比較

0001 == 1 
0010 == 2 
0011 == 3 

1 & 2 == 0 (false) 
1 & 3 == 1 (true) 
2 & 3 == 2 (true) 

本質上它是兩個值的匹配值。

(0001) 
& (0010) 
--------- 
    (0000) //Neither have the same bit 

    (0011) 
& (0010) 
--------- 
    (0010) //both have bit 2 

    (0101) 
& (0110) 
--------- 
    (0100) // Both have the 3rd bit 

    (0111) 
& (0110) 
--------- 
    (0110) // Both have the 2nd and 3rd bit 

C語言的布爾值爲0表示爲false。而且任何非零都是真的。

這證明第1位和第2位在數字3中可用,但是1和2沒有匹配位。

研究按位運算符。以獲得更好的理解。

http://en.wikipedia.org/wiki/Bitwise_operation

0

這是按位與運算。更好的問題是:這裏AND運算符的作業是什麼?爲什麼我們在這裏使用這種「低級」方法?

我們在這裏得到了一組標誌。按下的一組按鈕由event->buttons()表示。這意味着,它是所有按鈕的總和。但每個按鈕都是兩個獨特的冪,所以按下的所有按鈕的總和就是一組整數位。我希望你能理解這一點,因爲這是我們如何在C/C++中表示簡單的有限元素集的基本部分。

問題是,所謂bitset中的每一位代表集合中的一個元素。那麼每個元素都有一個唯一的編號,我們必須能夠對比特集進行測試(如果它包含在比特集中)。

如果要測試事件期間是否按住左按鈕,則必須檢查該位是否設置在位集中。這是通過使用按位AND運算符來完成的,因爲它使用布爾AND操作將操作數位的所有位按位組合。正如你應該知道的那樣,當且僅當兩個輸入位都爲真時,AND操作才返回true。所以按位 AND操作的輸入位爲掩碼。右操作數「過濾掉」出現在右操作數中的左操作數的位。

由於if條件被解釋爲真,當且僅當該值不等於零時,這等於右操作數的位是否也出現在左操作數中的問題。在這種具體的情況下,這意味着:值Qt::LeftButton按位值包含在值event->buttons()中,或者:由event->button()表示的位集中包含的Qt::LeftButton表示的位是否爲?

或者簡單地說:是否按住左鍵?