2013-11-02 19 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