2014-12-06 22 views
1

我想攔截來自放置在另一小部件頂部的小部件的事件,而不消耗它。如何攔截並傳播來自重疊小部件的事件

這是我到目前爲止。當點擊重疊的部分時,我希望它打印出「Hello World」,但我得到的只是「Hello」。

image

import sys 
from PyQt5 import QtWidgets 


class Button(QtWidgets.QPushButton): 
    def mousePressEvent(self, event): 
     print self.text() 
     return super(Button, self).mousePressEvent(event) 


app = QtWidgets.QApplication(sys.argv) 
window = QtWidgets.QWidget() 
window.setFixedSize(200, 100) 

button1 = Button("World", window) 
button1.move(10, 10) 
button2 = Button("Hello", window) 
button2.move(50, 15) 

window.show() 
app.exec_() 

下面是QML一個例子做什麼我要找的。

image

import QtQuick 2.0 


Item { 
    id: root 
    width: 200; height: 100 

    MouseArea { 
     anchors.fill: parent 
     onPressed: console.log("World") 
    } 

    Rectangle { 
     color: "green" 
     width: 100; height: 50 
     x: 10; y: 10 

     MouseArea { 
      anchors.fill: parent 
      propagateComposedEvents: true 
      onPressed: { 
       console.log("Hello"); 
       mouse.accepted = false; 
      } 
     } 
    } 
} 

單擊窗口產量的「世界」,而點擊綠色矩形產量「你好」,其次是「世界」。這裏的關鍵是propagateComposedEvents

回答

0

有一個window attribute這你想要做什麼:

button = Button("Hello", window) 
button.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents) 
+0

謝謝,但我想你可能誤解了問題。我不想要它*忽略*「你好」,我想它打印「你好」*和*「世界」;即重疊小部件接收事件,但也將其傳遞給直接位於其下的任何小部件。 – 2014-12-07 11:12:54

+0

@MarcusOttosson。不夠公平,但你的問題很具誤導性(自相矛盾) - 特別是在你說「最頂層的小部件應該完全透明 - 即對底層小部件沒有影響」的地方。此外,示例代碼似乎有缺陷,隱藏了跟蹤器問題中表達的實際意圖。 (在SO問題中鏈接到非現場資源通常不是一個好主意:總是試圖將所有相關信息放在問題本身中)。 – ekhumoro 2014-12-07 17:18:23

+0

對不起,@ekhumoro,如果你找到更好的表達方式,歡迎編輯這個問題。我覺得有必要添加「透明度」註釋,因爲有人可能會建議在每個底層窗口小部件上安裝事件過濾器,或者通過'QApplication.postEvent'手動傳播。現在編輯問題。 – 2014-12-08 08:03:13