Qt 与 Html 通信 之 QWebChannel


required

QWebChannel文档

Header #include
qmake: QT += webchannel
Since: Qt 5.4
Inherits: QObject

简介

QWebChannel 类的作用是向远端Html客户端暴露 QObject。

QWebChannel 填补了c++应用程序和 HTML/JavaScript 应用程序之间的空白。通过将QObject派生对象发布到QWebChannel并在html中引入qwebchannel.js脚本可从此处获取。在HTML端,可以透明地访问QObject的属性、公共槽和方法。不需要手动消息传递和数据序列化,c++方面的属性更新和信号发射将自动传输到可能远程运行的HTML客户机。在客户端,将为任何发布的c++ QObject创建JavaScript对象。它反映了c++对象的API,因此可以直观地使用。

成员函数

QWebChannel(QObject *parent = Q_NULLPTR)
virtual ~QWebChannel()
bool blockUpdates() const
void deregisterObject(QObject *object)
void registerObject(const QString &id, QObject *object)
void registerObjects(const QHash<QString, QObject *> &objects)
QHash<QString, QObject *> registeredObjects() const
void setBlockUpdates(bool block)
  • registerObject 函数可以向 html 中注册 QObject 对象,可以指定对象 ID。
  • deregisterObject 函数解除注册。
  • blockUpdates 函数 和 setBlockUpdates 分别用来 获取和 设置 对象更新的阻塞标志。当设置为true时,更新将被阻塞,远程客户端将不会收到有关属性更改的通知。
    更新将被记录下来,通过将此属性设置为false解除阻塞将记录发送到客户机。默认情况下,更新不会被阻止。

槽函数

void connectTo(QWebChannelAbstractTransport *transport)
virtual disconnectFrom(QWebChannelAbstractTransport *transport)
  • connectTo 函数连接 QWebChannel到指定的 transport 对象。然后 transport 对象将负责C++ App 与 远端Html客户端之间的通信。
  • disconnectFrom 函数 QWebChannel 与 transport 对象的连接。

使用实例

c++ 代码

connect(ui->editor, &QPlainTextEdit::textChanged, [this]() { 
                 m_content.setText(ui->editor->toPlainText()); 
});

QWebChannel *channel = new QWebChannel(this);
channel->registerObject(QStringLiteral("content"), &m_content);

PreviewPage *page = new PreviewPage(this);
page->setWebChannel(channel);
ui->preview->setPage(page);
ui->preview->setUrl(QUrl("qrc:/index.html"));

html 端

<!doctype html>
<html lang="en">
<meta charset="utf-8">
<head>
  <link rel="stylesheet" type="text/css" href="3rdparty/markdown.css">
  <script src="3rdparty/marked.min.js"></script>
  <script src="qwebchannel.js"></script>
</head>
<body>
  <div id="placeholder"></div>
  <script>
  'use strict';

  var placeholder = document.getElementById('placeholder');

  var updateText = function(text) {
      placeholder.innerHTML = marked(text);
  }

  new QWebChannel(qt.webChannelTransport,
    function(channel) {
      var content = channel.objects.content;
      updateText(content.text);
      content.textChanged.connect(updateText);
    }
  );
  </script>
</body>
</html>

更多实例见 qt example webchannel 部分


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM