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

Posted

技术标签:

【中文标题】QWebFrame addToJavaScriptWindowObject() 对象在 Javascript 中未定义【英文标题】:QWebFrame addToJavaScriptWindowObject() objects are undefined in Javascript 【发布时间】:2011-08-21 23:03:50 【问题描述】:

我又开始深入研究 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();

你好.cpp

...snip...

QString hello::say()

    return QString("Kyle");

你好.h

...snip includes...

class hello : public QObject

    Q_OBJECT

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

;

上面提到的 index.html 文件做了一个简单的alert(Hello.say()) 调用,但是做typeof Hello,我得到了 undefined。

我对 C++ 有点生疏,对 Qt 还很陌生,所以我确信这是一个菜鸟错误,但我很难过。

【问题讨论】:

【参考方案1】:

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

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

在连接到QWebFramejavaScriptWindowObjectCleared() signal 的插槽中并移动一些代码,以便您可以从该插槽访问框架。

另请参阅 Qt 中包含的Form Extractor example。

【讨论】:

【参考方案2】:

这个的核心实际上是用两种方法实现的,它们是 如下图:

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中测试的,请注意所有方法都应该放在“public slot”部分。

【讨论】:

您的attachObject() 公共槽类方法缺少frame 对象。我通过 QWebFrame *frame = ui->myWebViewWidget->page()->mainFrame(); 修复了它。除此之外,这正是对我有用的。 这非常适合将我的对象注入到 QWebView 小部件的 mainFrame() 中,但似乎无法将其注入到子 IFRAME 中。你会尝试什么? ***.com/q/33599474/105539

以上是关于QWebFrame addToJavaScriptWindowObject() 对象在 Javascript 中未定义的主要内容,如果未能解决你的问题,请参考以下文章

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

tr的梗

qt与js互相调用

QT源码问题

Qt5.WebView.添加节点的测试代码

如何将参数 -fvisibility=default 添加到 CMAKE? [复制]