QT环境下开发带内嵌页面的客户端程序都是通过QWebVeiw来显示网页。
QWebView *view = newQWebView(parent);
view->load(QUrl("http://qt.nokia.com/"));
view->show();
但是,以上简单的代码仅仅只是页面显示,因为默认情况下,出于安全的考虑,是没有任何c++对象插入到web中的。为了让web能够访问本地对象,C++应用程序必须通过以下的方式允许web访问,代码如下:
QWebFrame *frame =myWebPage->mainFrame();
frame->addToJavaScriptWindowObject("someNameForMyObject",myObject);
QWebFrame::addToJavaScriptWindowObject() ,将一个本地对象插入到web环境中。至此,JS就可以通过链接本地对象的信号的方式与C++通信了;
Ø 将JS全局函数连接到本地对象的信号
functionmyInterestingScriptFunction() { ... }
...
myQObject.somethingChanged.connect(myInterestingScriptFunction);
Ø 将JS成员函数连接到本地对象的信号
var obj = { x: 123 };
var fun = function() { print(this.x); };
myQObject.somethingChanged.connect(obj, fun);
当C++需要调用JS时,只需要简单的发送信号即可:
myQObject.somethingChanged("hello");
JS可以通过调用本地C++对象的方法,与C++通信。本地C++对象须满足以下要求:
1、 本地对象须从QObject派生
2、 必须打开QT源对象宏
3、 供JS调用的方法必须是 Q_INVOKABLE
EG:
class myQObject : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE voidthisMethodIsInvokableInQtScript();
void thisMethodIsNotInvokableInQtScript();
...
};
JS也可以通过访问C++对象属性与c++通信。
如果c++本地对象的属性如下定义:
Q_PROPERTY(bool enabled READenabled WRITE setEnabled)
那么JS访问其属性的代码如下:
myQObject.enabled = true;
...
myQObject.enabled = !myQObject.enabled;