2

我又开始深入研究 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 很陌生,所以我确信这是一个菜鸟错误,但我很难过。

4

2 回答 2

6

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

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

在连接到javaScriptWindowObjectCleared()信号的插槽中QWebFrame并移动一些代码,以便您可以从该插槽访问帧。

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

于 2011-08-24T18:50:21.940 回答
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中测试的,请注意所有方法都应该放在“public slot”部分。

于 2015-07-22T04:09:20.640 回答