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);
在连接到QWebFrame
的javaScriptWindowObjectCleared()
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 ¶m );
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 中未定义的主要内容,如果未能解决你的问题,请参考以下文章