2015-09-04 43 views
0

獲取發件人在QLabel()上右鍵單擊的方式是什麼?我想知道在哪個Widget上點擊了鼠標右鍵。我有代碼來獲得這個職位,但我怎樣才能獲得發件人?PyQt - 跟蹤發件人的contextMenu

獲取發件人我可以取回accessibleName()

這是我目前的最低代碼:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 



import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import * #!/usr/bin/python 
# -*- coding: utf-8 -*- 



import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self):    

     # qbtn = QtGui.QPushButton('Quit', self) 
     label = QLabel("BG Sessions", self) 
     label.setContextMenuPolicy(Qt.CustomContextMenu) 
     label.setObjectName("title") 
     label.customContextMenuRequested.connect(self.clearCache) 
     label.move(50, 50)  

     self.setGeometry(300, 300, 250, 150) 
     self.setWindowTitle('Quit button')  
     self.show() 

    def clearCache(self, pos): 
     print pos 


def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

回答

1

,如果你想使用sender()亞歷山大Lutsenko的的建議請記住這一點: QT-documentation

警告:此功能違反了模塊化的面向對象的原則。但是,當許多信號連接到單個插槽時,訪問發送者可能會很有用。

如果所有發送該信號的小部件來自相同類型,則可以使用findChild()代替。這正與我的tableViews:

# create signalMapper 
self.signalMapper = QtCore.QSignalMapper(self) 
self.signalMapper.mapped[str].connect(<slot>) 

# connect the widgets with signalMapper 
self.<widget>.<yourSignal>.connect(self.signalMapper.map) 
self.signalMapper.setMapping(self.<widget>, self.<widget>.objectName())   # sends objectName() to slot 

# in slot: 
obj = self.findChild(QtWidgets.QLabel,objectname) 
1

你可以改變您連接信號,這樣你在你從連接信號的對象的引用傳遞的方式。

例如:

my_object.customContextMenuRequested.connect(lambda pos, obj=my_object: self.clearCache(pos, obj)) 

(你當然會需要修改clearCache(),使其接受這個額外的參數)

注:obj=my_object線是不是多餘的,見here瞭解詳情。

+0

什麼時候我只想通過obj但不是pos?當我這樣做時,我仍然得到對象的位置 – user1767754

+0

'customContextMenuRequested'信號發出的位置,並且沒有什麼可以做的。所以,當你仍然必須將'pos'作爲'lambda'函數的參數時,如果你不想將它傳遞給'clearCache'(例如'my_object.customContextMenuRequested.connect(lambda pos,obj = my_object:self.clearCache(obj))' –