2010-01-11 42 views
5

如果有谁知道好的教程或描述使用QtWebKit的一个Windows桌面应用程序中创建的HTML GUI的方法文章中,我想知道。QtWebKit的作为桌面应用程序GUI

我主要关心之间传递消息,事件和信息可以说,一个DLL(用C++编写为例)和GUI(QtWebKit的)。

需要良好的可靠参考文献......

回答

4

这并不容易:Web浏览器是出于安全考虑的要塞。所以从网页中的JS到浏览器以外的东西很难。

此外,QtWebKit的是不是一个非常开放的API。你的情况最大的障碍是它不提供你访问DOM,所以你只能替换整个HTML。

因此,您需要修补并编写大量代码来实现缺失的API和函数。

由于Qt 4.6已经发布,所以有QWebElement(例子为see the docs),所以你至少可以访问DOM并修改它。这会让很多事情变得更简单。我建议决定谁来控制浏览器:您的应用程序是否是JavaScript外部调用的应用程序,或者应用程序是否真的在C++中,并且您将浏览器用作智能UI呈示器?

一个更简单的方法可能是让你的思想工作,将启动内部Web服务器时,您的应用程序启动,然后打开指向本地服务器的URL一个QtWebKit的视图。然后,您可以使用所有标准的Web开发工具。 Eclipse将这种技术用于其内部帮助系统。

+2

doeesn't QWebElement和QWebElementSelection可以访问操作DOM元素吗? – 2010-01-11 09:37:43

+0

它确实........ – 2010-01-11 10:01:36

+0

我不知道Qt 4.6已经发布。你是对的,看看这个链接:http://doc.trolltech.com/4.6/qt4-6-intro.html#dom-access-api – 2010-01-11 10:32:07

2

对于基本的用法,examples从奇趣应该让你开始。

Qt的方法的正侧是暴露对象到脚本是比较容易的,例如参见here。然后,不同嵌入式webkit中的JavaScript可以很容易地与C++进行通信(当然,如果您在C++端提供支持,则可以在其他窗口中使用脚本)。不利的一面是,API似乎还不够稳定,似乎缺少从JavaScript向C++对象添加事件侦听器的支持(或者至少我没有看到它应该如何完成)。

放置自定义绘制的元素到页面又是相当简单的,你的插件嵌入到页面(例如通过<object>标签),并从QWebPluginFactory::create()返回定制QWidgets。

重要的是要始终牢记:调用嵌入式webkit(例如,用于评估JavaScript)应始终在主线程中发生。

+0

感谢您提供富有洞察力的评论。您能否提供更多关于为什么“调用嵌入式webkit(例如,用于评估JavaScript)应始终出现在主线程中的信息”? – EightyEight 2010-03-04 17:47:11

+0

在任何当前浏览器中,我知道脚本引擎驻留在主线程中,并且不是线程安全的。插件开发人员必须确保调用浏览器是从正确的线程发出的,除非一些API函数已经处理好了 - 如果你没有得到未定义的行为并且很可能崩溃。 – 2010-03-04 20:04:55

3

我复制/粘贴位来自不同的部分,但我这是怎么插入的对象是提供给JavaScript,然后使用JavaScript交谈的主要应用。似乎运作良好...

void MyApi::setWebView(QWebView *view) { 

    QWebPage *page = view->page(); 
    m_frame = page->mainFrame(); 

    attachObject(); 
    connect(m_frame, SIGNAL(javaScriptWindowObjectCleared()), 
     this, SLOT(attachObject())); 

} 

void MyApi::attachObject() { 

    m_frame->addToJavaScriptWindowObject(QString("MyApi"), this); 

} 

这使得MyApi对象存在于JavaScript和我可以调用从MyApi类提供的任何时隙。