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