首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT4.6向QWebView窗口对象添加对象和子对象(C++ & Javascript)

QT4.6向QWebView窗口对象添加对象和子对象(C++ & Javascript)
EN

Stack Overflow用户
提问于 2010-04-28 03:20:27
回答 1查看 6.2K关注 0票数 6

我正在使用Qt的QWebView,并且已经发现了许多添加到webkit窗口对象的很好的用途。

我想做的一件事是嵌套对象..。例如:

在Javascript里我可以..。

代码语言:javascript
复制
var api = new Object;
api.os = new Object;
api.os.foo = function(){}
api.window = new Object();
api.window.bar = function(){}

显然,在大多数情况下,这将通过一个更多的OO框架来完成。

这就形成了一个整洁的结构:

代码语言:javascript
复制
>>>api
-------------------------------------------------------
   - api                Object {os=Object, more... }
     - os               Object {}
           foo          function()
     - win              Object {}
           bar          function()
-------------------------------------------------------

现在,我能够用我需要的所有qtC++方法和信号来扩展window对象,但是它们都必须处于"window“的根子类中。这迫使我编写一个js包装对象来获取我想要的DOM中的层次结构。

代码语言:javascript
复制
>>>api
-------------------------------------------------------
   - api                Object {os=function, more... }
     - os_foo           function()
     - win_bar          function()
-------------------------------------------------------

这是一个非常简单的例子..。我想要对象作为参数等等..。

有人知道用扩展WebFrame窗口对象的对象传递子对象的方法吗?

下面是我如何添加对象的一些示例代码:

mainwindow.h

代码语言:javascript
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QWebFrame>
#include "mainwindow.h"
#include "happyapi.h"

class QWebView;
class QWebFrame;
QT_BEGIN_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);

private slots:
    void attachWindowObject();
    void bluesBros();

private:
    QWebView *view;
    HappyApi *api;
    QWebFrame *frame;

};

#endif // MAINWINDOW_H

mainwindow.cpp

代码语言:javascript
复制
#include <QDebug>
#include <QtGui>
#include <QWebView>
#include <QWebPage>

#include "mainwindow.h"
#include "happyapi.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    view = new QWebView(this);
    view->load(QUrl("file:///Q:/example.htm"));

    api = new HappyApi(this);

    QWebPage *page = view->page();
    frame = page->mainFrame();

    attachWindowObject();

    connect(frame,
            SIGNAL(javaScriptWindowObjectCleared()),
        this, SLOT(attachWindowObject()));

    connect(api,
            SIGNAL(win_bar()),
        this, SLOT(bluesBros()));

    setCentralWidget(view);
};

void MainWindow::attachWindowObject()
{
        frame->addToJavaScriptWindowObject(QString("api"), api);
};

void MainWindow::bluesBros()
{
        qDebug() << "foo and bar are getting the band back together!";
};

paryapi.h

代码语言:javascript
复制
#ifndef HAPPYAPI_H
#define HAPPYAPI_H

#include <QObject>

class HappyApi : public QObject
{
        Q_OBJECT

public:
        HappyApi(QObject *parent);

public slots:
        void os_foo();

signals:
        void win_bar();

};

#endif // HAPPYAPI_H

happyapi.cpp

代码语言:javascript
复制
#include <QDebug>

#include "happyapi.h"

HappyApi::HappyApi(QObject *parent) :
        QObject(parent)
{

};

void HappyApi::os_foo()
{
        qDebug() << "foo called, it want's it's bar back";
};

example.htm

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Stackoverflow Question</title>
<script type='text/javascript' 
    src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
</head>

<body>
<button type="button" onclick="api.os_foo()">Foo</button>
<button type="button" onclick="api.win_bar()">Bar</button>
</body>
</html>

我对C++编程相当陌生(来自web和python背景)。

希望这个例子不仅能帮助其他新用户,而且对一个更有经验的c++程序员来说也是有趣的。

谢谢你能提供的任何帮助。:)

EN

回答 1

Stack Overflow用户

发布于 2012-03-07 00:06:14

我也有同样的问题,并在这里找到了一个答案:http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html

访问儿童QObjects

默认情况下,QObject的每个命名子(即QObject::objectName()不是空字符串)都可以作为JavaScript包装器对象的属性使用。例如,如果您的QDialog具有一个objectName属性为"okButton“的子小部件,则可以通过表达式在脚本代码中访问该对象。

代码语言:javascript
复制
 myDialog.okButton

由于objectName本身就是一个Q_PROPERTY,所以可以操纵脚本代码中的名称,例如重命名一个对象:

代码语言:javascript
复制
 myDialog.okButton
 myDialog.okButton.objectName = "cancelButton";
 // from now on, myDialog.cancelButton references the button
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2726609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档