そのため、システム上のいくつかのファイルに基づいてオプションのメニューを生成しています。メニューのオプションを動的に生成する必要があるオブジェクトのリストリストがあり、作成を行っている関数に使用するオブジェクトを知らせる必要があります。いろいろ調べた結果、以下の記事を見つけました。私の担当者はまだ高くないのでコメントできませんでした: How to pass arguments to callback functions in PyQt
これを実行すると、シグナル マッパーが正しく動作しません。handleButton を正しく呼び出していません。シグナルマッパーを正しく使用する方法についてのアイデアはありますか?
from PyQt4 import QtGui, QtCore
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.mapper = QtCore.QSignalMapper(self)
self.toolbar = self.addToolBar('Foo')
self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextOnly)
for text in 'One Two Three'.split():
action = QtGui.QAction(text, self)
self.mapper.setMapping(action, text)
action.triggered.connect(self.mapper.map)
self.toolbar.addAction(action)
self.mapper.mapped['QString'].connect(self.handleButton)
self.edit = QtGui.QLineEdit(self)
self.setCentralWidget(self.edit)
def handleButton(self, identifier):
print 'run'
if identifier == 'One':
text = 'Do This'
print 'Do One'
elif identifier == 'Two':
text = 'Do That'
print 'Do Two'
elif identifier == 'Three':
print 'Do Three'
text = 'Do Other'
self.edit.setText(text)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(300, 60)
window.show()
sys.exit(app.exec_())
編集:
古いスタイルのシグナル/スロット接続を使用することで、これが修正されることがわかりました。
#action.triggered.connect(self.mapper.map)
self.connect(action, QtCore.SIGNAL("triggered()"), self.mapper, QtCore.SLOT("map()"))
と
#self.mapper.mapped['QString'].connect(self.handleButton)
self.connect(self.mapper, QtCore.SIGNAL("mapped(const QString &)"), self.handleButton)
新しいスタイルの接続を間違って使用していませんか?