2012-08-04 3 views
2

필자는 PyQt와 함께 인터페이스를 사용하고 Yapsi를 사용하여 플러그인을 추가하고 있습니다. Yapsy가 내 모든 플러그인을 발견하고 내 메인 윈도우의 메뉴에 모두 추가했습니다. 각 플러그인은 트리거 된 신호로 활성화됩니다. QAction에 대한이 신호에는 params가 없으므로 어떤 플러그인이 신호를 방출했는지 알아야합니다.QAction을 위해 pyqt에서 triggered() 신호를 다시 구현하는 방법은 무엇입니까?

이 관련 코드는 다음과 같습니다

pluginMenu = self.menuBar().addMenu("P&lugins") 

# Create plugin manager 
self.manager = PluginManager(categories_filter={ "Formatters": Formatter}) 
self.manager.setPluginPlaces(["plugins"]) 

# Load plugins 
self.manager.locatePlugins() 
self.manager.loadPlugins() 

# A do-nothing formatter by default 
self.formatters = {} 

for plugin in self.manager.getPluginsOfCategory("Formatters"): 

# plugin.plugin_object is an instance of the plugin 
print(plugin.plugin_object.name) 
# The method to create action associated each input to default triggered() signal 
newAction = self.createAction(plugin.plugin_object.name, slot=self.updatePreview()) 


self.addActions(pluginMenu, (newAction, None)) 
self.formatters[plugin.plugin_object.name] = (plugin.plugin_object, newAction) 

def updatePreview(self): 
    # Here I need know what plugin emit the signal  
    #=================================================================== 

가 좀 PARAMS와 다른 신호와 신호를 conect 생각하지만 난 그것을하는 방법을 모르겠어요.

답변

0

내가 Yapsi 무엇 모르겠지만, QObject.sender 방법이있다 :

QObject를 QObject.sender (자기)

가 신호를 보낸 개체에 대한 포인터를 반환은,

라고하는 경우가 신호에 의해 활성화 된 슬롯; 포인터는 이고이 객체의 스레드 컨텍스트에서이 함수를 호출하는 슬롯을 실행하는 동안에 만 유효합니다.

보낸 사람이 이 소멸되거나 보낸 사람의 신호에서 연결이 끊어지면이 함수가 반환하는 포인터가 유효하지 않게됩니다.

경고 :이 기능은 모듈화 원칙의 객체 지향 원칙을 위반합니다. 그러나 신호가 단일 슬롯에 연결된 경우 발신자에게 액세스하는 것이 유용 할 수 있습니다.

경고 : 앞서 언급했듯이 슬롯이 Qt.DirectConnection을 통해이 개체의 스레드와 다른 스레드 에서 호출 될 때 유효한이 함수의 반환 값은 이 아닙니다. 이 유형의 시나리오에서는이 기능을 사용하지 마십시오. 여기

좀 더 팁 : http://blog.odnous.net/2011/06/frequently-overlooked-and-practical.html

+0

Yapsy는 새로운 플러그인을 추가하기위한 간단한 라이브러리입니다. 소프트웨어를 더 모듈화하기에 좋습니다. –

0

이 작업을 수행하는 올바른 방법 QSignalMapper 함께.

예 코드 : 이는 문자열 "이름"파라미터와 triggered 신호를 재 방사한다

signalmap = QSignalMapper(self) 
signalmap.mapped[QString].connect(self.handler) 
... 
signalmap.setMapping(action, name) 
action.triggered[()].connect(signalmap.map) 

. int, QWidget 또는 QObject 매개 변수를 사용하여 신호를 다시 보낼 수도 있습니다.

관련 문제