신호에 연결할 때 PYQT 매개 변수를 슬롯으로 보내는 매개 변수
문제
클릭 할 때 트리거 이벤트를 가져 오는 슬롯에 연결되는 작업 표시 줄 메뉴가 있습니다. 이제 문제는 클릭 한 메뉴 항목을 알고 싶지만 해당 정보를 연결된 기능으로 보내는 방법을 모르겠습니다. 동작을 기능에 연결하는 데 사용되는 것은 다음과 같습니다.
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
일부 이벤트가 값을 반환한다는 것을 알고 있지만 트리거 ()은 그렇지 않습니다. 그래서 어떻게 이런 일을합니까? 내 자신의 신호를 만들어야합니까?
해결책
a lambda
다음은 다음과 같습니다 PYQT 책:
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
그건 그렇고, 당신은 또한 사용할 수 있습니다 functools.partial
, 그러나 나는 그것을 발견한다 lambda
메소드는 더 간단하고 명확합니다.
다른 팁
이미 언급했듯이 여기 Lambda 함수를 사용하여 실행하려는 메소드에 추가 인수를 전달할 수 있습니다.
이 예에서는 버튼을 누르면 addControl ()을 호출 한 함수로 문자열 OBJ를 전달할 수 있습니다.
# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button's clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
print name
funcTools.partial을 사용하십시오
그렇지 않으면 Lambda를 사용하는 경우 스크립트가 실행될 때 인수를 동적으로 전달할 수 없다는 것을 알게됩니다.
일반적으로 각 메뉴 항목이 다른 슬롯에 연결되어 있어야하며 각 슬롯이 자체 메뉴 항목에 대해서만 기능을 처리해야합니다. 예를 들어, "저장", "Close", "Open"과 같은 메뉴 항목이있는 경우 각각에 대해 별도의 슬롯을 만들어야합니다.
그렇게하고 싶지 않다면 사용할 수 있습니다. qobject :: sender () 기능은 발신자에 대한 포인터를 얻기 위해 (예 : 신호를 방출 한 객체)를 얻습니다. 그래도 당신이 성취하려는 것에 대해 조금 더 듣고 싶습니다.
나는 또한 당신이 사용할 수 있다고 덧붙이고 싶습니다. sender
방법 신호를 보낸 위젯을 찾아야하는 경우 방법. 예를 들어:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName