Qt 5.7-QWebEngineView-将HTML按钮单击事件连接到C ++ / Qt插槽

Moh*_*wer 3 qt pyqt5

我正在使用Qt 5.7 QWebEngineView。

如何将HTML按钮单击事件连接到C ++ / PyQt5侧的Q_SLOT?

我找不到一个明确的例子。

Moh*_*wer 5

我创建了一个桥接QObject,实现此类时遇到的错误是我忘记添加@QtCore.pyqtSlot装饰器,这一点很重要。

class Bridge(QtCore.QObject):
    @QtCore.pyqtSlot()
    def some_slot():
        print("Slot Invoked")
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了一个QWebEngineView和一个QWebChannel,并将的网络频道设置QWebEnginePage为该频道,反之亦然。

然后,我首先创建了self.helper_bridge我自己不使用的Bridge QObject ,self只是helper_bridge自己使用了它,当然这使我的应用崩溃了

class MainWidget(object):
    def __init__(self):
        ...
        self.webView = QtWebEngineWidgets.QWebEngineView(parent)

        channel = QtWebChannel.QWebChannel(self.webView.page())
        self.webView.page().setWebChannel(channel)

        self.helper_bridge = Bridge()
        channel.registerObject("helperBridge", self.helper_bridge)

        url = QtCore.QUrl("file:///path/to/index.html")
        self.webView().page().load(url)
        ...
Run Code Online (Sandbox Code Playgroud)

最后,index.html页面

请注意Qt提供的第二个脚本。

在这里,我创建了QWebChannel给定传输方式的实例:qt.webChannelTransport,并且在回调内部,您可以看到click事件绑定。

<html>                                                                          
    <head>                                                                        
    </head>                                                                       
    <body>                                                                        
        <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js'</script>
        <script src='qrc:///qtwebchannel/qwebchannel.js'></script>
      <h1>hello</h1>                                         
      <ul>                                                   
          <li>list item 1</li>                                                      
          <li>list item 2</li>                                                      
      </ul>                                                                       
      <a href='#go'>GO</a>                                                      
      <script>                                                                    
        $(document).ready(function(){
            new QWebChannel(qt.webChannelTransport, function(channel){            
                $('h1').on('click', function({
                    channel.objects.helperBridge.some_slot()
                });
            });
        });                                                                       
      </script>
  </body>
Run Code Online (Sandbox Code Playgroud)

参考文献: