簡體   English   中英

如何使用 QT 與 html 元素交互

[英]How can I interact with html elements use QT

例如,我有一個帶有按鈕和標簽(或其他東西)的簡單 HTML 頁面。 如何更改標簽(或其他內容)中的文本並使用 QT 捕獲按鈕單擊。 我嘗試使用 QWebEngineView 來顯示 html,但我不知道如何與 QT 模塊中的元素交互,只需更改 url,但我認為它不是更好的方法

為了能夠與使用 QWebEngine 呈現的 HTML 交互,您需要使用QWebChannel 您可以在Qt WebChannel JavaScript API 頁面找到基本指南。

要在 HTML 頁面中實現與 JavaScript 的互通,您需要:

  1. 在項目文件中添加Qt += webchannel

  2. 實現一個QObject派生類,它應該是 C++ 和 JavaScript 之間的代理。 使其在 JavaScript 中可用的最簡單方法是為您打算在 JavaScript 中使用的值創建 getter、setter 和信號,並將它們公開為Q_PROPERTY 例子:

class ProxyClass: public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString value READ value WRITE setValue NOTIFY valueChanged)

public:
    explicit ProxyClass(QObject *parent = nullptr);

    QString value() const;
    void setValue(const QString &aValue);

signals:
    void valueChanged(const QString &aValue);

};
  1. 使用QWebEngineView::setHtml將 HTML 設置為 QWebEngineView,實例化您的“代理”類並為頁面創建 QWebChannel(請注意,您可以在 QWebChannel 中注冊多個對象)。 例子:
//create QWebEngineView and set HTML from resources
auto webView = new QWebEngineView;
QFile htmlFile(":/page.html");
htmlFile.open(QIODevice::ReadOnly);
QString html = htmlFile.readAll();
webView->setHtml(html);

//create and set up the instance of your "proxy" class
auto proxy = new ProxyClass;

//create QWebChannel and set it for the page
QWebChannel *webChannel = new QWebChannel(webView->page());
webChannel->registerObject(QStringLiteral("proxy"), proxy);
webView->page()->setWebChannel(webChannel);
  1. 在 HTML 中嵌入qwebchannel.js文件。 文件位於<Qt installation directory>/Examples/Qt-<version>/webchannel/shared目錄。 您可以將其包含在應用程序資源中並使用<script type="text/javascript" src="qrc:/qwebchannel.js"></script>嵌入 HTML

  2. 在 HTML 中創建onload事件處理程序並在其中初始化 QWebChannel。 例子:

function loaded() {
    new QWebChannel(qt.webChannelTransport, function (channel) {
        <!--get and assign "proxy"-->
        window.proxy = channel.objects.proxy;

        <!--now you can-->
    
        <!--get values-->
        let proxyValue = proxy.value;

        <!--connect signals-->
        proxy.valueChanged.connect(() => {
            ...
        });

    });
}

function someFunction(newValue) {

   <!--set values-->
   proxy.value = newValue; 

}
...

<body onload="loaded()">...</body>

一旦你初始化了一個網絡頻道並將“代理”對象分配給窗口對象,你就可以在 JavaScript 的任何地方自由地使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM