2015-05-25 3 views
0

Итак, я создаю меню опций, основанное на некоторых файлах в моей системе. У меня есть список списков объектов, которые мне нужно для динамического генерации опции в меню, и должны иметь возможность позволить функции, которая делает создание, знать, какой объект использовать. После некоторых исследований я нашел сообщение ниже. Я не мог комментировать, так как моя репутация еще не высока: How to pass arguments to callback functions in PyQtTrouble Understanding Signal Mapper 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_()) 

EDIT:

Я обнаружил, что при использовании соединений сигнал/слот старого стиля это исправлено:

#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) 

Am I неправильно использовать соединения нового стиля?

Основано на this post, а также original link Я отправил сообщение, я думал, что делаю все правильно.

ответ

1

Исходный пример кода (который я написал) работает отлично для меня, используя Python2 или Python3 с несколькими новейшими версиями PyQt4. Однако, если я использую действительно старую версию PyQt4 (4.7), обработчик больше не будет вызван.

Причина (и раствор) для этого дано в ответ на почтовой рассылке вы связаны с:

Это на самом деле проблема с QSignalMapper.map() вызывается из прокси, а не соединения нового стиля.

Для устранения этой проблемы явно указать сигнал, совместимый с картой() ...

self.b1.clicked[()].connect(self.mapper.map) 

PyQt снимок сегодняшнего будет умнее о поиске полезной слот Qt , прежде чем решить, что он должен использовать прокси, так что обходной путь не понадобится.

Есть некоторые сигналы (например, clicked и triggered), который всегда посылает значение по умолчанию, если вы явно не запрашиваете иначе. С сигналами старого стиля, можно указать, по умолчанию не перегружать его с SIGNAL("triggered()"), но с сигналами нового стиля, вы должны сделать это следующим образом:

action.triggered[()].connect(self.mapper.map) 

Но это необходимо только с очень старыми версиями PyQt4 - основная проблема была исправлена ​​еще в 2010 году (не знаю точной версии, но 4.8 должно быть в порядке).

+0

Спасибо @ekhumoro попытается установить более новую версию – jspada