문제

동적으로 생성 된 메뉴 시스템에서 클릭 한 항목을 알 수 있어야합니다. 단순히 문자열 표현이더라도 클릭 한 내용 만 알고 싶습니다.

def populateShotInfoMenus(self):
    self.menuFilms = QMenu()
    films = self.getList()

    for film in films:
        menuItem_Film = self.menuFilms.addAction(film)
        self.connect(menuItem_Film, SIGNAL('triggered()'), self.onFilmSet)
        self.menuFilms.addAction(menuItem_Film)

def onFilmRightClick(self, value):
    self.menuFilms.exec_(self.group1_inputFilm.mapToGlobal(value))

def onFilmSet(self, value):
    print 'Menu Clicked ', value
도움이 되었습니까?

해결책

사용하는 대신 onFilmSet 연결 수신기로서 직접 Lambda 기능을 사용하여 추가 매개 변수를 전달할 수 있습니다.

receiver = lambda film=film: self.onFilmSet(self, film)
self.connect(menuItem_Film, SIGNAL('triggered()'), receiver)

다른 팁

QT의 속성 시스템을 살펴보십시오. 문자열이 포함 된 속성을 동적으로 추가 할 수 있으며, 원하는 모든 것을 정의합니다. 그런 다음 슬롯에서 sender () 메소드를 사용하여 Qobject 호출 슬롯을 얻을 수 있습니다. 그런 다음 설정 한 속성을 쿼리하고 원하는대로 수행하십시오.

그러나 이것은 이것을하는 가장 좋은 방법이 아닙니다. sender ()를 사용하는 것은 모듈성의 객체 지향 원리를 위반하기 때문에 권장되지 않습니다.

가장 좋은 방법은 QsignalMapper 클래스를 사용하는 것입니다. 이 클래스는 다른 객체에서 다른 인수가있는 동일한 슬롯에 신호를 맵핑합니다.

나는 PYQT를 사용하지 않았으므로 정확한 구문이나 예제를 제공 할 수는 없지만 약간의 연구에서는 찾기가 어렵지 않아야합니다.

나는 비슷한 문제를 알아 내려고 노력했고 위의 코드를 살펴본 후 이것이 저에게 효과가있는 것입니다. 모두 함께 보여주는 것이 좋을 것이라고 생각했습니다. =))

self.taskMenu = QtGui.QMenu("Task")
self.tasks = self.getTasks() #FETCHES A LIST OF LIST
self.menuTasks = QtGui.QMenu()
for item in self.tasks:
     menuItem_Task = self.taskMenu.addAction(item[1]) 
     receiver = lambda taskType=item[0]: self.setTask(taskType)
     self.connect(menuItem_Task, QtCore.SIGNAL('triggered()'), receiver)
     self.taskMenu.addAction(menuItem_Task)

def setTask(self,taskType):
     print taskType

몇 가지 추가 정보만으로도 이유는 모르겠지만 Lambda 기능은 연결 용 새로운 PYQT 구문과 작동하지 않습니다.

코드가 작동하지 않는 예 :

    self.contextTreeMenuAssignTo = QtGui.QMenu(self)
    actionAssign = contextMenu.addMenu( self.contextTreeMenuAssignTo )
    actionAssign.setText("Assign to : ")
    for user in self.whoCanBeAssignated() :
        actionAssignTo = QtGui.QAction( user[0]  ,self)
        self.contextTreeMenuAssignTo.addAction( actionAssignTo )
        actionAssignTo.triggered.connect(  lambda userID = user[1] :  self.assignAllTo( userID )  )

그러나 마지막 줄에 구식 연결 구문을 사용하는 경우 :

self.connect(actionAssignTo, QtCore.SIGNAL('triggered()'),  lambda userID = user[1] :  self.assignAllTo( userID )  )    

모든 것이 괜찮습니다. 새로운 Connection Syntax를 사용하면 루프의 마지막 요소 만 얻습니다.

나는 찾았다 이것 PYQT5, Python3 에서이 문제를 다루는 것은 여기에서 답변하십시오. 나는 그것을 완전히 이해하지 못하기 때문에 BVAL 변수는 정확하지 않지만 그것을 찾는 데 오랜 시간이 걸렸으므로 여기서 공유 할 것이라고 생각했습니다. BVAL은 트리거에서 부울 값을 선택하고 TaskType을 통과시킬 수 있습니다.

self.taskMenu = QtGui.QMenu("Task")
self.tasks = self.getTasks() #FETCHES A LIST OF LIST
self.menuTasks = QtGui.QMenu()

for item in self.tasks:
   menuItem_Task = self.taskMenu.addAction(item[1]) 
   receiver = lambda: bVal, taskType=item: self.setTask(bVal, taskType)
   menuItem_Task.triggered.connect(receiver)
   self.taskMenu.addAction(menuItem_Task)

def setTask(self, ignore_bVal, taskType):
   print taskType
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top