2011-10-21 36 views
3

这是在Python/PySide。子类QWebView不发生反应,以超链接的点击

我想通过重载PySide.QtWebKit.QWebView小工具来创建自己的父母web浏览器。然后,每当有人点击该小部件的链接我检查,看看如果我们要为无效的网站,如果不是我们的进展,如果是的话,我重定向到一个通用的网页。

因此,我已经子类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() 

回答

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_())