我已经开始深入挖掘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错误,但我很难过。
答案 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 ¶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中进行了测试,请注意所有方法都应该放在"公共插槽"部分。