質問

私は、動的に生成されたメニューシステム内でクリックしたどのような項目を知ることができるようにする必要があります。私は、それは単に文字列表現だ場合でも、私は上のクリックしたかを知りたい。

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を使用しての、あなたは追加のパラメータを渡すことができるようにラムダ関数を使用します:

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

他のヒント

Qtのプロパティシステムを見てみましょう。あなたは、動的にアクションを定義する文字列、または何かあなたが望むを含むプロパティを追加することができます。そして、あなたはスロットを呼び出すにQObjectを得るために、スロットで送信者()メソッドを使用することができます。次に、設定したプロパティを照会し、それに応じてやりたい。

しかし、これは、これを行うための最善の方法ではありません。それはモジュール方式のオブジェクト指向の原則に違反しているため、送信者を()を使用すると、お勧めできません。

最善の方法は、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

ただ、いくつかの追加情報、 私はなぜ知らないが、ラムダ関数は、接続のための新しい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 )  )

しかし、あなたは古いスタイルの接続構文を持つ最後の行をsubsitute場合:

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

すべてが正常です。 (

:新しい接続構文を使用すると、あなただけのループの最後の要素を取得します

私はにhref="https://stackoverflow.com/questions/28319889/pyqt5-whats-this-boolean-passed-when-a-menu-action-is-triggered">ました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