这个问题困扰比较久,特发帖请大家帮忙,如果能够帮忙解决问题,可以酬谢,另外也很高兴认识新的pyqt的朋友。
Windows中有message与event的概念,差别在于
BEGIN_EVENTSINK_MAP是应用于COM组件的事件链接点的,捕获事件产生消息
BEGIN_MESSAGE_MAP是应用于窗口的消息循环的,捕获消息,执行响应函数
问题的背景:
一,有一个COM架构带event的东东(Teststand),要从mfc的代码转为pyqt实现。目前手上有mfc的源代码,使用了自定义的事件。
比如MFC中有些event,
ON_EVENT(CTestExecDlg, IDC_APPLICATIONMGR, 1 /* ExitApplication */, OnExitApplication_ApplicationMgr, VTS_NONE) ON_EVENT(CTestExecDlg, IDC_APPLICATIONMGR, 10 /* Wait */, OnWait_ApplicationMgr, VTS_BOOL)
ON_EVENT(CTestExecDlg, IDC_APPLICATIONMGR, 11 /* HandleError */, OnHandleError_ApplicationMgr, VTS_I4 VTS_BSTR) ON_EVENT(CTestExecDlg, IDC_APPLICATIONMGR, 22 /* DisplayExecution */, OnDisplayExecutionApplicationMgr, VTS_DISPATCH VTS_I4)
ON_EVENT(CTestExecDlg, IDC_APPLICATIONMGR, 21 /* DisplaySequenceFile */, OnDisplaySequenceFileApplicationMgr, VTS_DISPATCH VTS_I4)
二,因为整个项目要在python+pyqt的环境下实现,想把这些event事件用pyqt的方式来实现。一种方案A说是用signal/slot的方式来模仿mfc的代码。一种方案B说是用winEventFilter() 再加ctypes处理windows函数来模仿mfc的代码。
三,关于方案A,用pyqt去查询它的event,出现了如下的提示:
void ExitApplication () [signal]
Connect a slot to this signal:
QObject::connect(object, SIGNAL(ExitApplication()), receiver, SLOT(someSlot()));
===========================================================================
void DisplayExecution (IDispatch* exec, ExecutionDisplayReasons reason) [signal]
Connect a slot to this signal:
QObject::connect(object, SIGNAL(DisplayExecution(IDispatch*, ExecutionDisplayReasons)), receiver, SLOT(someSlot(IDispatch*, ExecutionDisplayReasons)));
===========================================================================
void DisplaySequenceFile (IDispatch* file, SequenceFileDisplayReasons reason) [signal]
Connect a slot to this signal:
QObject::connect(object, SIGNAL(DisplaySequenceFile(IDispatch*, SequenceFileDisplayReasons)), receiver, SLOT(someSlot(IDispatch*, SequenceFileDisplayReasons)));
pyqt把mfc的event用signal来表示。
四,弄到这里,彻底被搞晕了。因为pyqt的signal里面没有见到这么复杂的写法,比如带了一个IDispatch*的参数,这在pyqt的代码中要如何表示呢?
因此还是希望请有带MFC的消息机制的代码成功的转成pyqt的程序的高手帮忙看一下。