QAxObject 没有为 COM 对象创建槽信号
QAxObject is not creating slots signals for a COM object
我正在使用 Qt3.3(没有升级选项,我们来得及,完全远离 Qt)
当我创建 WebBrowser 对象时:
m_lpWebBrowser = new QAxWidget(this, "ActiveX WebBrowser Plugin");
m_lpWebBrowser->setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}");
为来自浏览器的每个事件创建信号(总共 55 个)
但是,如果我使用以下内容响应 DocumentCompleted 事件:
pCtrl->QueryInterface(IID_IWebBrowser2, (void**)&brws);
brws->get_Document((IDispatch**)&doc);
m_pDocument = new QAxObject(doc, this, "Document");
其中 pCtrl 是事件返回的 IDispatch 我得到一个显然是 HTMLDocument 的对象(我可以为任何 IHTMLDocument(n) 接口查询接口)但它只有三个信号:
signal(const QString&,int,void*)
propertyChanged(const QString&)
exception(int,const QString&,const QString&,const QString&)
如果我使用更迂回的方法为文档获取 IDispatch* 并从中构建 QAxObject*,也会出现同样的问题。
在这两种情况下,很明显从未为新的 QAxObject 调用 setControl,这似乎是构建信号所必需的。
我需要访问的具体接口是 IHTMLDocumentEvents.
我做错了什么?
我无法解决为什么这不起作用的问题,但事实证明编写自己的事件接收器并不像看起来那么令人生畏。 QAxEventSink提供了一个简单的例子,演示了其实你只需要实现Invoke函数即可。
我正在使用 Qt3.3(没有升级选项,我们来得及,完全远离 Qt)
当我创建 WebBrowser 对象时:
m_lpWebBrowser = new QAxWidget(this, "ActiveX WebBrowser Plugin");
m_lpWebBrowser->setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}");
为来自浏览器的每个事件创建信号(总共 55 个)
但是,如果我使用以下内容响应 DocumentCompleted 事件:
pCtrl->QueryInterface(IID_IWebBrowser2, (void**)&brws);
brws->get_Document((IDispatch**)&doc);
m_pDocument = new QAxObject(doc, this, "Document");
其中 pCtrl 是事件返回的 IDispatch 我得到一个显然是 HTMLDocument 的对象(我可以为任何 IHTMLDocument(n) 接口查询接口)但它只有三个信号:
signal(const QString&,int,void*)
propertyChanged(const QString&)
exception(int,const QString&,const QString&,const QString&)
如果我使用更迂回的方法为文档获取 IDispatch* 并从中构建 QAxObject*,也会出现同样的问题。
在这两种情况下,很明显从未为新的 QAxObject 调用 setControl,这似乎是构建信号所必需的。 我需要访问的具体接口是 IHTMLDocumentEvents.
我做错了什么?
我无法解决为什么这不起作用的问题,但事实证明编写自己的事件接收器并不像看起来那么令人生畏。 QAxEventSink提供了一个简单的例子,演示了其实你只需要实现Invoke函数即可。