Подкласс QWebView не реагирует на клики по гиперссылкам - PullRequest
3 голосов
/ 22 октября 2011

Это в 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 голосов
/ 22 октября 2011

Есть несколько проблем с кодом, который вы разместили. Во-первых, вы импортируете и 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_())
...