Qt 4.6 Добавление объектов и подобъектов в объект окна QWebView (C ++ и Javascript) - PullRequest
6 голосов
/ 28 апреля 2010

Я работаю с Qt QWebView и нашёл множество отличных применений для добавления в объект окна webkit.

Одна вещь, которую я хотел бы сделать, это вложенные объекты ... например:

в Javascript я могу ...

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

очевидно, что в большинстве случаев это будет сделано с помощью более OO js-framework.

В результате получается аккуратная структура:

>>>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?

Вот пример кода того, как я добавляю объект:


mainwindow.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

mainwindow.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";
};

пример.htm,

<!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 ++ (из сети и Python).

Надеюсь, этот пример будет не только помогать другим новым пользователям, но и будет более интересным для более опытного программиста на С ++.

Спасибо за любую помощь, которая может быть оказана. :)

1 Ответ

2 голосов
/ 07 марта 2012

У меня была такая же проблема, и я нашел ответ здесь: 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
...