子类化的 QWebView 不响应超链接点击

3 投票
1 回答
1791 浏览
提问于 2025-04-17 04:47

这是关于Python和PySide的内容。

我想创建一个自己的家长控制网页浏览器,通过重写PySide.QtWebKit.QWebView这个小部件来实现。每当有人在这个小部件上点击链接时,我会检查一下这个网站是否有效,如果有效就继续访问,如果无效就转到一个通用的页面。

所以我已经对PySide.QtWebKit.QWebView进行了子类化,但我没有收到任何关于链接被点击的通知。我重写了linkClicked这个函数,但当点击链接时,这个函数根本没有运行?

我哪里做错了?为什么我的函数不能对点击链接的“事件”做出反应?我是不是需要重写网页对象,而不是这个类,才能对链接点击做出反应?

import PySide.QtWebKit
import sys
from PyQt4 import QtGui


class BrowserWindow( PySide.QtWebKit.QWebView ):
    # Class Variables:

    def __init__( self, _parent ):
        """ Constructor: """

        super(BrowserWindow, self).__init__()
        PySide.QtWebKit.QWebView(None)


    def linkClicked(self, arg__1):
        """ Post: """

        #print("LINK CLICKED")
        #text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog', 
        #    'Enter your name:')

        self.load("http://yahoo.com")


def main():

    app = QtGui.QApplication(sys.argv)

    view = BrowserWindow(None) #PySide.QtWebKit.QWebView(None)
    view.load("http://google.com")
    view.show()

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

1 个回答

4

你发的代码有几个问题。首先,你同时引入了PySide和PyQt4,这样做不好。其次,QWebView.linkClicked是一个信号,而不是一个可以被重写的方法,所以你不能去覆盖它。第三,你把一个字符串传给了QWebView.load,其实应该传一个QtCore.QUrl

不过,除了这些问题之外,你还需要在网页上设置linkDelegationPolicy,这样才能覆盖它的链接处理方式。

下面是你代码的一个修改版本,应该能解决所有问题:

from PySide import QtCore, QtGui, QtWebKit

class BrowserWindow(QtWebKit.QWebView):
    def __init__(self, parent=None):
        super(BrowserWindow, self).__init__()
        self.linkClicked.connect(self.handleLinkClicked)

    def handleLinkClicked(self, url):
        print(url.toString())

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    view = BrowserWindow()
    view.load(QtCore.QUrl("http://google.com"))
    view.page().setLinkDelegationPolicy(
        QtWebKit.QWebPage.DelegateAllLinks)
    view.show()
    sys.exit(app.exec_())

撰写回答