2011-08-21 126 views
3

我已经开始深入研究C++和Qt,并且一直在使用WebKit Javascript/Qt绑定。我有所有的移动部分工作,除了我的QObject子类在Javascript方面是“未定义”的。下面是我遇到的麻烦简单的测试程序:QWebFrame addToJavaScriptWindowObject()对象在Javascript中未定义

我的主窗口中执行:

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
ui->setupUi(this); 

// instantiate a webview 
QWebView *webview = new QWebView(this); 
webview->setGeometry(0, 0, 400, 300); 
webview->setUrl(QUrl("file://localhost/Users/kyle/Sites/tests/qt/index.html")); 

// instantiate and attach our QObject 
hello *h = new hello(); 

QWebFrame *frame = webview->page()->mainFrame(); 
frame->addToJavaScriptWindowObject("Hello", h); 

// show the window 
webview->show(); 
} 

HELLO.CPP

...snip... 

QString hello::say() 
{ 
    return QString("Kyle"); 
} 

Hello.h

...snip includes... 

class hello : public QObject 
{ 
    Q_OBJECT 

public: 
    hello(); 
    Q_INVOKABLE QString say(); 

}; 

以上这个index.html文件做了一个简单的alert(Hello.say())调用,但是做了typeof Hello ,我弄不明白。我对C++有点生疏,对Qt也很新颖,所以我确信这是一个noob错误,但我很难过。

回答

0

这样做的核心是真正的两种方法,如下所示 实现:

void MyApi::setWebView(QWebView *view) 
{ 
    QWebPage *page = view->page(); 
    frame = page->mainFrame(); 

    attachObject(); 
    connect(frame, &QWebFrame::javaScriptWindowObjectCleared, this, &MyApi::attachObject); 
    // old approach 
    //connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(attachObject())); 
} 

void MyApi::attachObject() 
{ 
    frame->addToJavaScriptWindowObject(QString("MyApi"), this); 
} 

此代码是所有你需要为了使所有的 MyApi的公有槽的对象可见到JavaScript。该MyApi类提供了两个公共插槽:(!是的,插槽可以返回的东西)

public slots: 
    void doSomething(const QString &param); 
    int doSums(int a, int b); 

第一个插槽只是消息记录到调试输出,第二个返回 它的两个参数的总和。他们被称为 从JavaScript这样的:

MyApi.doSomething('Hello from JS page 2!!!!'); 

sum = MyApi.doSums(2, 3); 
alert('C++ says the sum is ' + sum); 

上面的代码是在QT5.5测试,请注意所有的方法应放在“公共插槽”一节。

+0

您的'attachObject()'公共槽类方法缺少'frame'对象。我通过执行'QWebFrame * frame = ui-> myWebViewWidget-> page() - > mainFrame();'来修复它。除此之外,这正是为我工作的。 – Volomike

+0

这非常适合将我的对象注入到QWebView小部件的mainFrame()中,但似乎无法将其注入到子IFRAME中。你会尝试什么? http://stackoverflow.com/q/33599474/105539 – Volomike