2013-11-02 41 views
1

我需要製作一個帶有後退按鈕(無地址欄)的簡單瀏覽器,並且可以下載內容。 atm,它可以下載(使用這裏的代碼:PySide QWebView and downloading unsupported content),但我不能添加一個工具欄來添加一個後退按鈕。 現在,當我運行它時,它會創建2個窗口:一個用瀏覽器,一個用工具欄。我怎樣才能讓他們在一個窗口?無法使用PySide(Python)添加工具欄

import sys 
import os 
from time import sleep 
from PySide import QtCore, QtGui, QtWebKit, QtNetwork 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self):  

     hbox = QtGui.QHBoxLayout(self) 
     pixmap = QtGui.QPixmap("tux.png") 

     lbl = QtGui.QLabel(self) 
     lbl.setPixmap(pixmap) 

     hbox.addWidget(lbl) 
     self.setLayout(hbox) 

     self.setGeometry(300, 300, 280, 170) 
     self.setWindowTitle('Red Rock') 
     self.show() 

     #self.hide()   

class Browser(QtGui.QMainWindow): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 

     self.web = QtWebKit.QWebView() 
     self.tb=self.addToolBar("Toolbar") 
     self.tb.show() 
     self.web.page().setForwardUnsupportedContent(True) 
     self.web.page().unsupportedContent.connect(self.download) 

     self.manager = QtNetwork.QNetworkAccessManager() 
     self.manager.finished.connect(self.finished) 
     self.pbar=QtGui.QProgressBar() 
     self.pbar.setMaximumWidth(120) 


     exitAction = QtGui.QAction(QtGui.QIcon('ceva.png'), 'Exit', self) 
     exitAction.setShortcut('Ctrl+Q') 
     exitAction.triggered.connect(self.close) 


     backAction = QtGui.QAction(QtGui.QIcon('tux.png'), 'Back', self) 
     backAction.setShortcut('Ctrl+A') 
     backAction.triggered.connect(self.close) 


     self.toolbar = self.addToolBar('Exit') 
     self.toolbar.addAction(exitAction) 
     self.toolbar.addAction(backAction) 

     self.setGeometry(300, 300, 350, 250) 
     #self.setWindowTitle('Toolbar')  
     self.show() 

    def download(self, reply): 
     # this just shows me a picture to know it's downloading 
     self.loading=Example() 

     self.request = reply.request() 
     self.request.setUrl(reply.url()) 
     self.reply = self.manager.get(self.request) 

    def finished(self): 
     path = os.path.expanduser(
      os.path.join('~', 
        unicode(self.reply.url().path()).split('/')[-1])) 
     if self.reply.hasRawHeader('Content-Disposition'): 
      cnt_dis = self.reply.rawHeader('Content-Disposition').data() 
      if cnt_dis.startswith('attachment'): 
       path = cnt_dis.split('=')[1] 

     destination = QtGui.QFileDialog.getSaveFileName(self, "Save", path) 
     if destination: 
      f = open(destination[0], 'wb') 
      f.write(self.reply.readAll()) 
      f.flush() 
      f.close() 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 

    browser = Browser() 
    if len(sys.argv) > 1: 
     browser.web.load(QtCore.QUrl('http://' + argv[1])) 
    else: 
     browser.web.load(QtCore.QUrl('http://www.google.com')) 

    browser.web.show() 

    sys.exit(app.exec_()) 

回答

1

您只需要將webview設置爲其父窗口的子項即可。由於父母是QMainWindow,你應該使用setCentralWidget爲:

self.web = QtWebKit.QWebView() 
    self.setCentralWidget(self.web) 

而且,你不需要調用上的主要窗口小部件的孩子show(),這樣你就可以從Browser.__init__刪除self.tb.show()self.show() ,然後只是做:

browser.show() 
    sys.exit(app.exec_()) 
+0

謝謝你,作品像一個魅力! –

+1

@AcsinteFlorin。如果您發現答案有幫助,請[標記爲已接受](http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work/65088#65088)。 – ekhumoro

+0

他沒有,但我upvoted。 – Alex