QWebFrame addToJavaScriptWindowObject()对象在Javascript中是未定义的

时间:2011-08-21 23:03:50

标签: javascript qt qwebkit

我已经开始深入挖掘C ++和Qt,并且一直在使用WebKit Javascript / Qt绑定。我的所有移动部件都在工作,除了我的QObject子类在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错误,但我很难过。

2 个答案:

答案 0 :(得分:6)

任何时候都无法在页面中插入对象。你应该把那一行:

frame->addToJavaScriptWindowObject("Hello", h);

在连接到QWebFrame的{​​{3}}的插槽中并移动一些代码,以便您可以从该插槽访问该帧。

另请参阅Qt。

中包含的javaScriptWindowObjectCleared() signal

答案 1 :(得分: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中进行了测试,请注意所有方法都应该放在"公共插槽"部分。