6

動的に生成されたメニュー システムで、どの項目をクリックしたかを知る必要があります。単に文字列表現であっても、何をクリックしたかだけを知りたいのです。

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
4

5 に答える 5

11

接続のレシーバーとして直接使用する代わりにonFilmSet、ラムダ関数を使用して、追加のパラメーターを渡すことができます。

receiver = lambda film=film: self.onFilmSet(self, film)
self.connect(menuItem_Film, SIGNAL('triggered()'), receiver)
于 2009-09-23T08:01:51.117 に答える
2

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
于 2016-01-28T04:51:48.020 に答える
1

いくつかの追加情報です。理由はわかりませんが、ラムダ関数は接続の新しい 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 )  )    

すべて順調。新しい接続構文では、ループの最後の要素のみを取得します:(

于 2013-02-26T21:37:56.703 に答える
1

Qt のプロパティ システムを見てみましょう。アクションを定義する文字列または必要なものを含むプロパティを動的に追加できます。次に、sender() メソッドをスロットで使用して、スロットを呼び出す QObject を取得できます。次に、設定したプロパティをクエリし、それに応じて必要なことを行います。

しかし、これはこれを行う最良の方法ではありません。モジュール性のオブジェクト指向の原則に違反するため、sender() の使用はお勧めしません。

最良の方法は、QSignalMapper クラスを使用することです。このクラスは、異なるオブジェクトからの信号を、異なる引数で同じスロットにマップします。

私は PyQt を使用したことがないため、正確な構文や例を示すことはできませんが、少し調べれば見つけるのは難しくありません。

于 2009-09-23T08:03:54.007 に答える
1

私は同様の問題を理解しようとしていましたが、上記のコードを見た後、これがうまくいきました。まとめて見せたらいいのにと思いました。=)

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
于 2011-01-16T03:41:19.193 に答える