Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)

Posted

技术标签:

【中文标题】Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)【英文标题】:Qt 4.6 Adding objects and sub-objects to QWebView window object (C++ & Javascript) 【发布时间】:2011-02-13 04:08:34 【问题描述】:

我正在使用 Qt 的 QWebView,并且发现了很多用于添加到 webkit 窗口对象的绝佳用途。

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

javascript 中我可以...

var api = new Object;
api.os = new Object;
api.os.foo = function()
api.window = new Object();
api.window.bar = function()

显然,在大多数情况下,这将通过更面向对象的 js 框架来完成。

这会产生一个整洁的结构:

>>>api
-------------------------------------------------------
   - api                Object os=Object, more... 
     - os               Object 
           foo          function()
     - win              Object 
           bar          function()
-------------------------------------------------------

现在我可以使用我需要的所有 qtC++ 方法和信号来扩展窗口对象,但它们都“似乎”必须位于“窗口”的根子节点中。这迫使我编写一个 js 包装器对象以在 DOM 中获得我想要的层次结构。

>>>api
-------------------------------------------------------
   - api                Object os=function, more... 
     - os_foo           function()
     - win_bar          function()
-------------------------------------------------------

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

有谁知道通过扩展 WebFrame 窗口对象的对象传递子对象的方法?

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


ma​​inwindow.h

#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

ma​​inwindow.cpp

#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!";
;

happyapi.h

#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

#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

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>*** 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++ 程序员详细说明。

感谢您提供的任何帮助。 :)

【问题讨论】:

【参考方案1】:

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

访问子 QObjects

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

 myDialog.okButton

由于 objectName 本身是 Q_PROPERTY,因此您可以在脚本代码中操作名称,例如重命名对象:

 myDialog.okButton
 myDialog.okButton.objectName = "cancelButton";
 // from now on, myDialog.cancelButton references the button

【讨论】:

以上是关于Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt 插件管理 Qt 对象

将不同的编译器添加到QT

在现有 C++ QT 项目中实例化 QML 对象

QT之QObject简单介绍

Qt 在特定区域中移动对象

QTime 将秒数添加到新对象