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

2024-04-12

我正在使用 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 的窗口对象的对象一起传递?

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


主窗口.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

主窗口.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!";
};

快乐API.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 背景)。

希望这个示例不仅可以帮助其他新用户,而且可以为更有经验的 C++ 程序员提供有趣的详细说明。

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


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

访问子 QObject

每个有名字的孩子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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript) 的相关文章

  • 如何从一维数组和静态字符串创建对象

    我想要一个像 var obj ABC name true dob true CDE name true dob true EFG name true dob true CBA name true dob true XYZ name true
  • 使用 JavaScript 格式化日期

    JavaScript 中的日期格式有问题 这是我的函数代码 originalDate 2016 03 02 09 12 14 989522 var d new Date originalDate month d getMonth 1 day
  • 在 onclick 事件上请求麦克风

    有一天 我偶然发现了这个 Javascript 录音机的例子 http webaudiodemos appspot com AudioRecorder index html http webaudiodemos appspot com Au
  • 需要使用 iFrame API 隐藏 YouTube 品牌

    我正在使用 YouTube iFrame API 在我的自定义播放器 javascript 播放器 中加载视频 我需要隐藏 Youtube 品牌 但是在 iOS 设备上 它显示带有以下参数的徽标 playerVars fs 1 autopl
  • Bootstrap 标签栏平滑移动导航按钮

    我有一个用于切换块的普通引导选项卡面板 在导航中切换块时 活动选项卡会突出显示 但现在 当我单击活动选项卡的背景时 它会立即发生变化 是否可以使切换选项卡时背景不会立即改变 而是根据需要哪个选项卡而平滑地左右移动 这可以用以下方法完成吗cs
  • 有什么方法可以复制 div 的渲染 HTML 吗?

    我正在开发电子邮件签名生成器 我想通过按按钮复制最终签名 而不是手动选择签名并将其复制到剪贴板 这意味着我需要它们的图像 文本和样式 我尝试了几种变体 包括 w3schools 的变体 但没有成功 其中一些只是复制文本 但没有样式 例子 h
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • jQuery UI Datepicker 奇怪的行为

    我在使用 jqueryUI 使用简单的日期选择器时遇到了一个奇怪的问题 我只想显示两个月的日历 包括上个月和当前月份 我使用了这段代码 function picker datepicker numberOfMonths 2 showCurr
  • Dialogflow Fulfillment Webhook 调用失败

    I am new to dialogflow fulfillment and I am trying to retrieve news from news API based on user questions I followed doc
  • 如何在 jQuery 中将标题转换为 URL slug?

    我正在 CodeIgniter 中开发一个应用程序 我试图在表单上创建一个字段来动态生成URL slug 我想做的是删除标点符号 将其转换为小写 然后用连字符替换空格 例如 Shane s Rib Shack 将变成 shanes rib
  • 如何将类型添加到 Vite 库构建中?

    我按照vite文档使用图书馆模式 https vitejs dev guide build html library mode我能够生成一个工作组件库 我创建了该项目vue ts预设 在我的组件中 我定义了道具及其类型 并使用了一些接口 但
  • 如何设置必须输入特定数字的字段?

    我想知道如何创建一个需要输入特定数字或文本的字段 例如 激活码 以及在输入的确认答案的情况下移动到 网页 并且在未确认的情况下移动到 另一页面 的按钮 使用必需的属性
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • 冒泡可用于图像加载事件吗?

    我可以用吗 window addEventListner 某种程度上来说 我所有的图像都有一个display none 图像加载后 我想设置display inline 这样我就可以规范下载图像时显示的内容 在这种情况下 我无法预加载图像
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • D3 向对象添加超链接?

    我正在尝试制作 D3 图 它将代表我网站的菜单 我尝试按照此处的其他指南添加超链接 但它们都不起作用 每个对象都会有一个不同的 URL 指向 主页 关于 联系方式等 如果添加超链接 我可以拖动对象吗 这意味着如果我按住单击 如果我单击该对象
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • AngularStrap 工具提示禁用我的自定义指令

    我正在尝试让 bs tooltip AngularStrap 指令与我自己的名为 checkStrength 的自定义指令一起使用 该指令检查密码的强度 单独使用这些指令中的任何一个时 它们都可以正常工作 但不能一起工作 This http
  • 选择单选按钮时隐藏/显示 3 个文本框

    我有 2 个单选按钮 选择一个文本框时 我想显示 3 个文本框 并在选择其他文本框时隐藏它 这是代码 这是我的 2 个单选按钮
  • 区分 NaN 输入和输入类型为“number”的空输入

    我想使用 type number 的表单输入 并且只允许输入数字

随机推荐

  • iOS 9 中 UITextView 根据内容的高度是错误的

    我通过编程方式动态地将视图添加到带有布局约束的滚动视图中 对于文本视图组件 我想根据文本视图中设置的文本设置高度约束 所以我创建了扩展 UITextView 的类 在文本视图类中 我编写了以下代码来添加高度约束 import CETextV
  • Matplotlib:更改各个网格线的颜色

    我现在只使用 Python 大约一个月 所以如果有一些我忽略的简单解决方案 我很抱歉 基本上我有一个包含 4 个子图的图 左边的 2 个显示纵向图 右边的显示纵向图某些点的散点图 您可以使用按钮单击纵向图不同点的散点图 当前所在纵向图的刻度
  • 无法在 Windows 10 中完全删除 Cygwin

    我无法删除 Windows 10 设置中的 Cygwin 我缩小了范围 导致问题的文件是C cygwin usr share avogadro crystals zeolites CON cif 就我而言 为什么无法删除cywin目录 文件
  • NextJS Zustand 持久状态

    我有这个 github 仓库 https github com salmanfazal01 next firebase starter https github com salmanfazal01 next firebase starter
  • 如何将我当前位置的地图绘制到特定的纬度经度值

    我使用 android 创建 Google 地图 我获取当前位置的纬度经度值并使用其他一些纬度经度值 现在如何在 2 个位置绘制最短路径线 我的主要 Activity java public class MainActivity exten
  • 如何防止此查询两次打印相同的结果?

    我设法创建了一个适合我需要的查询 但现在我遇到了问题 鉴于当前显示结果的方式 查询将每个结果重复两次 我怎样才能让它在显示一次的地方正常工作 Code sql SELECT DISTINCT contacts contact id user
  • 检查定期 ScheduledFuture 是否正在运行

    我有一个通过 Spring 安排的定期任务TaskScheduler schedule Runnable Trigger 鉴于返回的ScheduledFuture 有什么方法可以检查任务当前是否正在运行 经过一番测试后 public sta
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 即使在开始时已经输入,Ansible 同步也会提示密码

    Ansible v1 6 5 的同步模块提示输入密码 Enter passphrase for key 尽管我一开始就已经输入了运行剧本 知道为什么吗 我使用以下选项运行我的剧本 u myuser ask sudo pass private
  • 为什么资源文件生成的类位于具有不同名称的文件中?

    我有一个资源文件strings resx 生成的资源类在strings1 designer cs中 为什么会这样呢 问题具体在于 1 该文件内的类名是 strings 正如它应该的那样 请注意 我确实尝试删除 Designer cs 并通过
  • 数组按第一个值排序

    这是我当前的数组 Array 0 gt 10 13 1 gt 11 15 2 gt 12 7 3 gt 1 0 4 gt 2 0 5 gt 3 0 6 gt 4 0 7 gt 5 0 8 gt 6 0 9 gt 7 0 10 gt 8 0
  • 将回车符 (\r) 转换为实际覆盖

    问题 有没有办法将回车符转换为字符串中的实际覆盖 以便000000000000 r1010变换为101000000000 Context 1 初步目标 有号码x 0到255之间 在基数10中 我想将这个数字转换为基数2 添加尾随零以获得12
  • 如何选择在我的 Cocoa 应用程序中使用的网络接口

    我正在尝试在不同的网络上运行测试 我可以在两个 WiFi 连接之间切换 但我需要知道如何在连接了以太网电缆的 WiFi 上运行测试 所以基本上 我需要运行 ping 测试来检查机器上的所有网络是否正常工作 连接以太网端口后 它始终在以太网上
  • Maven:java.lang.NoClassDefFoundError:com/google/inject/internal/cglib/core/$CodeGenerationException

    每当我尝试构建任何 Maven 项目或生成一些原型时 我都会收到此错误 ERROR Error executing Maven ERROR java lang NoClassDefFoundError com google inject i
  • 动态注册本地Vue.js组件

    我们知道possible http v1 vuejs org guide components html Registration动态注册全局 Vue js 版本 1 组件 如下所示 Vue component my component M
  • SAS 宏日期问题

    我对 SAS 完全陌生 我的数据库包含 2000 2011 年的数据 我的数据集列表对于每个数据集都是这样的date TP 2004012 for 26JAN2004 TP 20040127 for 27JAN2004 TP 2004012
  • 在 PowerShell 中调用通用静态方法

    如何在 Powershell 中调用自定义类的通用静态方法 给定以下课程 public class Sample public static string MyMethod
  • 联合初始化

    我正在尝试全局初始化一个联合 如下例所示 include
  • UIView 子类绘制背景,尽管完全是空的drawRect: - 为什么?

    因此 我有一个自定义 UIView 子类 它可以绘制圆角边缘 东西绘制得很完美 但是背景总是填充整个边界 尽管首先剪切到路径 边框也画出来了above矩形背景 尽管我在绘制矩形中绘制了边框 在背景之前 所以我删除了drawRect 的全部内
  • Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)

    我正在使用 Qt 的 QWebView 并且发现添加到 webkit 窗口对象有很多很好的用途 我想做的一件事是嵌套对象 例如 在 JavaScript 中我可以 var api new Object api os new Object a