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

Вам просто нужно сделать веб-просмотр дочерним элементом его родительского окна. Поскольку родитель является QMainWindow, вы должны использовать setCentralWidget для этого:

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

Кроме того, вам не нужно вызывать show() на виджеты, которые являются потомками главного окна, так что вы можете удалить self.tb.show() и self.show() из Browser.__init__ , а затем просто выполните:

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

Спасибо, работает как очарование! –

+1

@AcsinteFlorin. Если вы нашли ответ полезным, пожалуйста [отметьте его как принято] (http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work/65088#65088). – ekhumoro

+0

Он не сделал, но я поддержал. – Alex

Смежные вопросы