Qt 4.6 Добавление объектов и подобъектов в объект окна QWebView (C++ и Javascript)
Я работаю с 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>Stackru 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 ответ
У меня была такая же проблема, и я нашел ответ здесь: 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