2013-02-11 63 views
3

如果我有一個開放的QWebView,我喜歡它的默認上下文菜單,並在「在新窗口中打開」作爲鏈接選項。但是,當用戶請求在新窗口中打開鏈接時,我似乎無法找到採取措施。覆蓋QWebPage.createWindow方法似乎不起作用,因爲當用戶選擇在新窗口中打開鏈接時,不會調用該方法。Qt/PyQt:我如何處理QWebView/QWebPage的「在新窗口中打開」操作?

有什麼建議嗎?我正在使用PyQt。

示例代碼:

class LocalWebPage(QWebPage): 
    def acceptNavigationRequest(self, webFrame, networkRequest, navigationType): 
     print '*acceptNavigationRequest**',webFrame, networkRequest, navigationType 
     return QWebPage.acceptNavigationRequest(self, webFrame, networkRequest, navigationType) 

    def createWindow(self, windowType): 
     print '--createWindow', windowType 
     return QWebPage.createWindow(self, windowType) 


class Browser(Ui_MainWindow, QMainWindow): 
    def __init__(self, base, name): 

     ... 
     self.page = LocalWebPage() 
     self.webViewMain = QWebView(self.centralwidget) 
     self.webViewMain.setPage(self.page) 
     ... 

我有調試打印在那裏,以驗證CreateWindow的不被調用。

回答

4

你需要通過重新實現QWebPagetriggerAction,像這樣打電話給自己的QWebViewcreateWindow方法,例如:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtGui, QtCore, QtWebKit 

class MyPage(QtWebKit.QWebPage): 
    def __init__(self, parent=None): 
     super(MyPage, self).__init__(parent) 

    def triggerAction(self, action, checked=False): 
     if action == QtWebKit.QWebPage.OpenLinkInNewWindow: 
      self.createWindow(QtWebKit.QWebPage.WebBrowserWindow) 

     return super(MyPage, self).triggerAction(action, checked) 


class MyWindow(QtWebKit.QWebView): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.myPage = MyPage(self) 

     self.setPage(self.myPage) 

    def createWindow(self, windowType): 
     if windowType == QtWebKit.QWebPage.WebBrowserWindow: 
      self.webView = MyWindow() 
      self.webView.setAttribute(QtCore.Qt.WA_DeleteOnClose, True) 

      return self.webView 

     return super(MyWindow, self).createWindow(windowType) 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.show() 
    main.load(QtCore.QUrl("http://www.example.com")) 

    sys.exit(app.exec_()) 
+1

謝謝,X.Jacobs。有關如何確定用戶右鍵單擊的URL /鏈接的任何建議? – 2013-02-15 19:05:25

2

這是右鍵單擊可以找到鏈接在QWebViewcontextMenuEvent方法,使用hitTestContent

def contextMenuEvent(self, event): 
    pos = event.pos() 
    element = self.page().mainFrame().hitTestContent(pos) 
    link_url = str(element.linkUrl().toString()) 
+0

hackery! ....... :) – mlvljr 2015-09-18 14:04:19