def __init__(self, varWrapper, distributedObjects): """ Constructor @param varWrapper datagraph.datagraphvw.DataGraphVW, holds the Data of the Variable to show @param distributedObjects distributedobjects.DistributedObjects, the DistributedObjects-Instance """ QGraphicsWebView.__init__(self, None) self.varWrapper = varWrapper self.distributedObjects = distributedObjects self.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsFocusable) self.htmlTemplate = Template(filename=sys.path[0] + '/datagraph/templates/htmlvariableview.mako') self.page().setPreferredContentsSize(QSize(0, 0)) self.setPreferredSize(QSizeF(0, 0)) self.setResizesToContents(True) self.incomingPointers = [] self.outgoingPointers = [] self.source = None # ids for ourself and the template handlers we will eventually render self.lastId = -1 self.uniqueIds = {} self.dirty = True self.id = self.getUniqueId(self) self.distributedObjects.signalProxy.variableUpdateCompleted.connect(self.render)
def graphicRenderer(self, svgInput): #Graphics rendering. scene = QGraphicsScene() self.dlg.graphicsView.setScene(scene) webview = QGraphicsWebView() webview.setContent(svgInput, 'image/svg+xml') scene.addItem(webview)
def __init__(self): QWidget.__init__(self) self._main_container = main_container.MainContainer() self._explorer_container = explorer_container.ExplorerContainer() self.tabs = QTabWidget(self) #Graph widget self._graph = GraphicsView() self._graphMl = GraphicsView() # Graph scene self.scene = GraphicsScene(self._graph) self.sceneMl = GraphicsScene(self._graphMl) path = os.path.join(PRJ_PATH, "img", 'textX-ninja.svg') self.scene.webview = QGraphicsWebView() self.create_webview(path, self.scene, self._graph) self.scene.addItem(self.scene.webview) self._graph.setScene(self.scene) self.set_view(self._graph) self._graphMl.setScene(self.sceneMl) self.set_view(self._graphMl) self.tabs.addTab(self._graph, "Metamodel") self.tabs.addTab(self._graphMl, "Model") #Main Layout main_layout = QVBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) main_layout.setSpacing(0) main_layout.addWidget(self.tabs)
def generateChart(self): scene = QtGui.QGraphicsScene() self.graphicsView.setScene(scene) #select data adn chart type chartType = self.getChartType() if self.validation.validateChart(chartType): chart = self.mapChartType[chartType]() self.webview = QGraphicsWebView() self.webview.resize(self.graphicsView.width()-20,self.graphicsView.height()-20) path = os.path.dirname(__file__)+'/js/' chartData = getattr(self,chartType + 'ChartData' )() chart.setData(chartData) self.webview.setHtml(chart.getHTML(),baseUrl=QUrl().fromLocalFile(path)) self.webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape) self.webview.setCacheMode(QtGui.QGraphicsItem.NoCache) frame = self.webview.page().mainFrame() frame.setScrollBarPolicy(Qt.Vertical,Qt.ScrollBarAlwaysOff) frame.setScrollBarPolicy(Qt.Horizontal,Qt.ScrollBarAlwaysOff) scene.addItem(self.webview) self.graphicsView.show() self.savePngFile.setEnabled(True) self.chartGenerated = True else: self.showValidateErrors()
def makeLayout(self): self.layout = QGraphicsLinearLayout(Qt.Vertical) self.flowComboLayout = QGraphicsLinearLayout(Qt.Horizontal) self.flowLabelLayout = QGraphicsGridLayout() #Flow Layout self.flowData = SvJanez() self.flowView = QGraphicsWebView() self.flowView.setUrl( QUrl(self.flowData.flowImageUrl) ) self.flowView.setEnabled(False) self.flowSelectorCombo = Plasma.ComboBox() self.flowSelectorCombo.addItem(u"Sveti Janez") self.flowSelectorCombo.addItem(u"Soteska") self.flowSelectorCombo.setMinimumWidth(125) self.flowSelectorCombo.textChanged.connect(self.flowSourceChanged) self.flowRefresh = Plasma.IconWidget() self.flowRefresh.setIcon("view-refresh") self.flowRefresh.clicked.connect(self.update) self.flowEnlargeButton = Plasma.IconWidget() self.flowEnlargeButton.setIcon("zoom-in") self.flowEnlargeButton.clicked.connect(self.showFullFlowWidget) self.flowLabel = Plasma.Label() self.flowLabel.setText(u"<b>Pretok:</b> ") self.flowDataLabel = Plasma.Label() self.flowLevelLabel = Plasma.Label() self.flowLevelLabel.setText(u"<b>Višina:</b> ") self.flowLevelDataLabel = Plasma.Label() self.flowTempLabel = Plasma.Label() self.flowTempLabel.setText(u"<b>Temperatura:</b> ") self.flowTempDataLabel = Plasma.Label() self.flowLabelLayout.addItem(self.flowLevelLabel,0,0) self.flowLabelLayout.addItem(self.flowLevelDataLabel,0,1) self.flowLabelLayout.addItem(self.flowLabel,1,0) self.flowLabelLayout.addItem(self.flowDataLabel,1,1) self.flowLabelLayout.addItem(self.flowTempLabel,2,0) self.flowLabelLayout.addItem(self.flowTempDataLabel,2,1) self.flowUpdateTimeSelector = UpdateTimeSelector() self.flowUpdateTimeSelector.setDefaultTime(4) self.flowUpdateTimeSelector.setDefaultInterval('h') self.flowUpdateTimeSelector.updateTimeSpin.valueChanged.connect(self.flowTimeChanged) self.flowUpdateTimeSelector.updateCheckBox.toggled.connect(self.flowTimerToggle) self.flowComboLayout.addItem(self.flowSelectorCombo) self.flowComboLayout.addStretch() self.flowComboLayout.addItem(self.flowEnlargeButton) self.flowComboLayout.addItem(self.flowRefresh) self.layout.addItem(self.flowComboLayout) self.layout.addItem(self.flowView) self.layout.addItem(self.flowLabelLayout) self.layout.addStretch() self.layout.addItem(self.flowUpdateTimeSelector.layout) self.layout.itemAt(0).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType) self.layout.itemAt(2).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType)
def initUI(self): self.countries = [] self.existingChecks = [] self.K = Kartograph() self.CountryInput = QtGui.QLineEdit(self) #self.CountryList = QtGui.QTextEdit(self) #self.CountryList.setReadOnly(True) self.AddButton = QtGui.QPushButton("Add", self) self.AddButton.clicked.connect(self.buttonClicked) self.GenButton = QtGui.QPushButton('Generate', self) self.GenButton.clicked.connect(self.generateClicked) self.DispButton = QtGui.QPushButton('Display', self) self.DispButton.clicked.connect(self.displayClicked) self.statusBar = QtGui.QStatusBar(self) self.br = QtSvg.QGraphicsSvgItem("world.svg").boundingRect() self.scene = QtGui.QGraphicsScene() self.view = QtGui.QGraphicsView(self.scene) self.SvgItem = QtSvg.QGraphicsSvgItem("world.svg").boundingRect() self.webview = QGraphicsWebView() self.webview.load(QtCore.QUrl("world.svg")) self.webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape) self.webview.setCacheMode(QtGui.QGraphicsItem.NoCache) self.webview.resize(self.br.width(), self.br.height()) self.scene.addItem(self.webview) self.view.resize(self.br.width()+10, self.br.height()+10) self.grid = QtGui.QGridLayout() self.grid.setSpacing(10) self.bottomCheck = 4 self.grid.addWidget(self.AddButton, 1, 1) self.grid.addWidget(self.GenButton, 2, 1) self.grid.addWidget(self.DispButton, 3, 1) #grid.addWidget(self.CountryList, 4, 1) self.grid.addWidget(self.CountryInput, 1, 2) self.grid.addWidget(self.statusBar, 36, 0, 1, 3, QtCore.Qt.AlignBottom) self.grid.addWidget(self.view, 2, 2, 34, 50) self.setLayout(self.grid) #self.center() self.setWindowTitle('Map Display - Width ' + str(self.br.width()) + ', Height ' + str(self.br.height())) self.generateClicked() self.displayClicked() self.show()
def __init__(self): super(QtGui.QGraphicsScene, self).__init__() self.view = QtGui.QGraphicsView(self) self.webview = QGraphicsWebView() self.webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape) self.webview.setCacheMode(QtGui.QGraphicsItem.NoCache) self.addItem(self.webview) self.webview.loadFinished.connect(self.svgLoaded)
def __init__(self, var): QGraphicsWebView.__init__(self, None) self.var = var self.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsFocusable) self.htmlTemplate = Template(filename=sys.path[0] + '/datagraph/templates/htmlvariableview.mako') self.page().setPreferredContentsSize(QSize(0, 0)) self.setPreferredSize(QSizeF(0, 0)) self.setResizesToContents(True) self.incomingPointers = [] self.outgoingPointers = [] self.source = None # ids for ourself and the template handlers we will eventually render self.lastId = -1 self.uniqueIds = {} self.dirty = True self.id = self.getUniqueId(self)
def load_graph(self, path, name, tabIndex): if tabIndex == 0: self.scene.clear() self.scene.webview = QGraphicsWebView() self.create_webview(path, self.scene, self._graph) self.scene.addItem(self.scene.webview) self._graph.setScene(self.scene) self._graph.fitInView(self.scene.itemsBoundingRect(), Qt.KeepAspectRatio) elif tabIndex == 1: self.sceneMl.clear() self.sceneMl.webview = QGraphicsWebView() self.create_webview(path, self.sceneMl, self._graphMl) self.sceneMl.addItem(self.sceneMl.webview) self._graphMl.setScene(self.sceneMl) self._graphMl.fitInView(self.sceneMl.itemsBoundingRect(), Qt.KeepAspectRatio) self.add_label(name, tabIndex) # focus on tab self.tabs.setCurrentIndex(tabIndex)
def __init__(self, var, distributedObjects): """ Constructor @param var datagraph.datagraphvw.DataGraphVW, holds the Data of the Variable to show @param distributedObjects distributedobjects.DistributedObjects, the DistributedObjects-Instance """ QGraphicsWebView.__init__(self, None) self.var = var self.distributedObjects = distributedObjects self.templateHandlers = [] self.setFlags(QGraphicsItem.ItemIsMovable) self.htmlTemplate = Template(filename=sys.path[0] + '/datagraph/htmlvariableview.mako') self.page().setPreferredContentsSize(QSize(0,0)) self.setPreferredSize(QSizeF(0, 0)) self.setResizesToContents(True) self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks); self.connect(self.page(), SIGNAL('linkClicked(QUrl)'), self.linkClicked, Qt.DirectConnection) self.connect(self.var, SIGNAL('changed()'), self.render) self.incomingPointers = [] self.outgoingPointers = [] self.render()
class Scene(QtGui.QGraphicsScene): def __init__(self): super(QtGui.QGraphicsScene, self).__init__() self.view = QtGui.QGraphicsView(self) self.webview = QGraphicsWebView() self.webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape) self.webview.setCacheMode(QtGui.QGraphicsItem.NoCache) self.addItem(self.webview) self.webview.loadFinished.connect(self.svgLoaded) def svgLoaded(self): frame = self.webview.page().mainFrame() fsize = frame.contentsSize() self.webview.resize(QtCore.QSizeF(fsize)) self.view.resize(fsize.width() + 10, fsize.height() + 10) self.webview.page().mainFrame().evaluateJavaScript(getJsScript('circle-test.js'))
def __init__(self, var): QGraphicsWebView.__init__(self, None) self.var = var self.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsFocusable) self.htmlTemplate = Template( filename=sys.path[0] + '/datagraph/templates/htmlvariableview.mako') self.page().setPreferredContentsSize(QSize(0, 0)) self.setPreferredSize(QSizeF(0, 0)) self.setResizesToContents(True) self.incomingPointers = [] self.outgoingPointers = [] self.source = None # ids for ourself and the template handlers we will eventually render self.lastId = -1 self.uniqueIds = {} self.dirty = True self.id = self.getUniqueId(self)
def makeLayout(self): self.layout = QGraphicsLinearLayout(Qt.Vertical) self.topCamLayout = QGraphicsLinearLayout(Qt.Horizontal) # Cam layout self.camRefreshButton = Plasma.IconWidget() self.camRefreshButton.setIcon("view-refresh") self.camRefreshButton.clicked.connect(self.update) self.camTimeLabel = Plasma.Label() self.camTimeLabel.setText(u"ob") self.camEnlargeButton = Plasma.IconWidget() self.camEnlargeButton.setIcon("zoom-in") self.camEnlargeButton.clicked.connect(self.showFullCamWidget) self.camSelectorCombo = Plasma.ComboBox() for source in sorted(self.camUrls.keys()): self.camSelectorCombo.addItem(source) self.camSelectorCombo.setMinimumWidth(125) self.camSelectorCombo.textChanged.connect(self.camChanged) self.camView = QGraphicsWebView() self.camView.setEnabled(False) self.camTimeDataLabel = Plasma.Label() self.camUpdateTimeSelector = UpdateTimeSelector() self.camUpdateTimeSelector.setDefaultTime(30) self.camUpdateTimeSelector.setDefaultInterval('min') self.camUpdateTimeSelector.updateTimeSpin.valueChanged.connect(self.camTimeChanged) self.camUpdateTimeSelector.updateCheckBox.toggled.connect(self.camTimerToggle) self.topCamLayout.addItem(self.camSelectorCombo) self.topCamLayout.addItem(self.camTimeLabel) self.topCamLayout.addItem(self.camTimeDataLabel) self.topCamLayout.addStretch() self.topCamLayout.addItem(self.camEnlargeButton) self.topCamLayout.addItem(self.camRefreshButton) self.layout.addItem(self.topCamLayout) self.layout.addItem(self.camView) self.layout.addItem(self.camUpdateTimeSelector.layout) self.layout.itemAt(0).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType) self.layout.itemAt(2).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType)
class WidgetChart(QWidget): """ a widget displaying a chart stock as a svg in the local file """ def __init__(self, parent): """create the widget""" QWidget.__init__(self, parent) # fetching the chart # ================== # file to open self.file = "bar_chart.svg" if sys.platform == "linux2": self.directorySep = "/" else: self.directorySep = "\\" self.wd = os.getcwd() # displaying the chart # ==================== # scene for displaying the graphics self.scene = QGraphicsScene() # view widget where the graphics will be self.view = QGraphicsView(self.scene) #get the size of the svg self.br = QGraphicsSvgItem(self.wd + self.directorySep + self.file).boundingRect() # web that is to say the svg file self.webview = QGraphicsWebView() self.loadWidget() # add the chart in the scene self.scene.addItem(self.webview) # resize the view self.view.resize(self.br.width()+10, self.br.height()+10) #add the view to the parent layout self.setLayout(QVBoxLayout()) self.layout().addWidget(self.view) def loadWidget(self): self.webview.load(QUrl(self.wd + self.directorySep + self.file)) self.webview.setFlags(QGraphicsItem.ItemClipsToShape) # self.webview.setCacheMode(QGraphicsItem.NoCache) self.webview.resize(self.br.width(), self.br.height())
def __init__(self, parent): """create the widget""" QWidget.__init__(self, parent) # fetching the chart # ================== # file to open self.file = "bar_chart.svg" if sys.platform == "linux2": self.directorySep = "/" else: self.directorySep = "\\" self.wd = os.getcwd() # displaying the chart # ==================== # scene for displaying the graphics self.scene = QGraphicsScene() # view widget where the graphics will be self.view = QGraphicsView(self.scene) #get the size of the svg self.br = QGraphicsSvgItem(self.wd + self.directorySep + self.file).boundingRect() # web that is to say the svg file self.webview = QGraphicsWebView() self.loadWidget() # add the chart in the scene self.scene.addItem(self.webview) # resize the view self.view.resize(self.br.width()+10, self.br.height()+10) #add the view to the parent layout self.setLayout(QVBoxLayout()) self.layout().addWidget(self.view)
def __init__(self, parent=None): super(Lectern, self).__init__(parent) self.anchor = None self.initMainMenu() self.initToolbar() splitter = QSplitter() self.tocView = QTreeView() self.tocView.clicked.connect(self.navTo) self.tocModel = TableOfContents() self.tocModel.isEmpty.connect(self.handleTOCLoad) self.tocView.setModel(self.tocModel) self.tocView.expandAll() self.tocView.hide() splitter.addWidget(self.tocView) self.webView = QGraphicsWebView() frame = self.webView.page().mainFrame() scene = QGraphicsScene() scene.addItem(self.webView) self.graphicsView = GraphicsView(scene) self.graphicsView.setFrameShape(QFrame.NoFrame) glWidget = QGLWidget(self) self.graphicsView.setViewport(glWidget) self.webView.loadFinished.connect(self.handleLoad) splitter.addWidget(self.graphicsView) self.setCentralWidget(splitter) self.ebook_info = {} self.setWindowTitle('Lectern') try: self.ebook_info = self.openBook(QApplication.arguments()[1]) except IndexError: pass
class Lectern(QMainWindow): def __init__(self, parent=None): super(Lectern, self).__init__(parent) self.anchor = None self.initMainMenu() self.initToolbar() splitter = QSplitter() self.tocView = QTreeView() self.tocView.clicked.connect(self.navTo) self.tocModel = TableOfContents() self.tocModel.isEmpty.connect(self.handleTOCLoad) self.tocView.setModel(self.tocModel) self.tocView.expandAll() self.tocView.hide() splitter.addWidget(self.tocView) self.webView = QGraphicsWebView() frame = self.webView.page().mainFrame() scene = QGraphicsScene() scene.addItem(self.webView) self.graphicsView = GraphicsView(scene) self.graphicsView.setFrameShape(QFrame.NoFrame) glWidget = QGLWidget(self) self.graphicsView.setViewport(glWidget) self.webView.loadFinished.connect(self.handleLoad) splitter.addWidget(self.graphicsView) self.setCentralWidget(splitter) self.ebook_info = {} self.setWindowTitle('Lectern') try: self.ebook_info = self.openBook(QApplication.arguments()[1]) except IndexError: pass def initMainMenu(self): menuBar = self.menuBar() menuBar.setNativeMenuBar(True) # TODO: add CROSS-PLATFORM shortcut keys. (e.g. For Quit, use ⌘Q on Mac OS X, ALT-F4 elsewhere) fileMenu = QMenu('File', menuBar) navMenu = QMenu('Navigate', menuBar) # File Menu openAction = QAction('Open', fileMenu) openAction.triggered.connect(self.chooseEbook) fileMenu.addAction(openAction) quitAction = QAction('Quit', fileMenu) quitAction.triggered.connect(self.closeEvent) fileMenu.addAction(quitAction) # Nav Menu prevChatperAction = QAction('Previous Chapter', navMenu) prevChatperAction.triggered.connect(self.prevChapter) navMenu.addAction(prevChatperAction) nextChatperAction = QAction('Next Chapter', navMenu) nextChatperAction.triggered.connect(self.nextChapter) navMenu.addAction(nextChatperAction) menuBar.addMenu(fileMenu) menuBar.addMenu(navMenu) def initToolbar(self): toolBar = QToolBar(self) chooseAction = QAction(self.style().standardIcon( QStyle.SP_DialogOpenButton), 'Open', toolBar) chooseAction.triggered.connect(self.chooseEbook) toolBar.addAction(chooseAction) self.prevAction = QAction(self.style().standardIcon( QStyle.SP_ArrowBack), 'Go back', toolBar) self.prevAction.setEnabled(False) self.prevAction.triggered.connect(self.prevChapter) toolBar.addAction(self.prevAction) self.nextAction = QAction(self.style().standardIcon( QStyle.SP_ArrowForward), 'Go forward', toolBar) self.nextAction.setEnabled(False) self.nextAction.triggered.connect(self.nextChapter) toolBar.addAction(self.nextAction) self.addToolBar(toolBar) def chooseEbook(self): path = QFileDialog.getOpenFileName(self, 'Open eBook', QDesktopServices.storageLocation( QDesktopServices.DocumentsLocation),'EPUBs (*.epub)') if not isfile(path): return if self.ebook_info is not None and 'temp_path' in self.ebook_info: if exists(self.ebook_info['temp_path']): rmtree(self.ebook_info['temp_path']) path = QDir.toNativeSeparators(path) self.ebook_info = self.openBook(path) def openBook(self, path): ebook_info = {} path = realpath(path) if not isfile(path): QMessageBox.critical(self, 'File not found', 'File not found') mimetype, _ = guess_type(path) if mimetype != 'application/epub+zip': QMessageBox.critical(self, 'Not an EPUB', 'Not an EPUB') return None ebook = ZipFile(path) names = ebook.namelist() if not 'META-INF/container.xml' in names: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'container.xml not '\ 'found') return None container_tree = etree.parse(ebook.open('META-INF/container.xml')) rootfile = container_tree.xpath("//*[local-name() = 'rootfile']") if len(rootfile) == 0: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'root not found in '\ 'manifest') return None content_opf = rootfile[0].get('full-path') if content_opf is None: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'content.opf not found') return None ebook_info['opf_root'] = posixpath.dirname(content_opf) tree = etree.parse(ebook.open(content_opf)) manifest = tree.xpath("*[local-name() = 'manifest']") if len(manifest) == 0: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'Manifest not found') return None manifest = manifest[0] items = {} for item in manifest: item_id = item.get('id') if item_id is None: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'Item has no id') return None href = item.get('href') if href is None: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'Item has no href') return None items[item_id] = href spine = tree.xpath("*[local-name() = 'spine']") if len(spine) == 0: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'Spine not found') return None spine = spine[0] ebook_info['chapters'] = [] for itemref in spine: idref = itemref.get('idref') if not idref in items: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'Item in spine '\ 'not found in manifest') return None ebook_info['chapters'].append(items[idref]) if len(ebook_info['chapters']) == 0: ebook.close() QMessageBox.critical(self, 'Invalid EPUB', 'Content not found') return None # Table of contents toc = tree.find("//*[@href='toc.ncx']") if toc is not None: toc_path = posixpath.join(ebook_info['opf_root'], 'toc.ncx') if toc_path in names: toc_tree = etree.parse(ebook.open(toc_path)) navMap = toc_tree.xpath("//*[local-name() = 'navMap']") if len(navMap) > 0: self.tocModel.importNavMap(navMap[0]) temp = QDir.toNativeSeparators(QDesktopServices.storageLocation( QDesktopServices.TempLocation)) # In case we have two copies of Lectern opening the same book. filename = '{0}-{1}'.format(splitext(basename(path))[0], uuid4()) ebook_info['temp_path'] = join(temp, filename) if exists(ebook_info['temp_path']): rmtree(ebook_info['temp_path']) ebook.extractall(ebook_info['temp_path']) ebook.close() ebook_info['index'] = 0 url = join(ebook_info['temp_path'], ebook_info['opf_root'], ebook_info['chapters'][0]) self.webView.setUrl(QUrl(url)) if len(ebook_info['chapters']) > 1: self.nextAction.setEnabled(True) return ebook_info def prevChapter(self): index = self.ebook_info['index'] chapters = self.ebook_info['chapters'] if index > 0: index -= 1 if index == 0: self.prevAction.setEnabled(False) url = join(self.ebook_info['temp_path'], self.ebook_info['opf_root'], chapters[index]) self.webView.setUrl(QUrl(url)) self.ebook_info['index'] = index self.nextAction.setEnabled(True) def nextChapter(self): index = self.ebook_info['index'] chapters = self.ebook_info['chapters'] if index < len(chapters) - 1: index += 1 if index == len(chapters) - 1: self.nextAction.setEnabled(False) url = join(self.ebook_info['temp_path'], self.ebook_info['opf_root'], chapters[index]) self.webView.setUrl(QUrl(url)) self.ebook_info['index'] = index self.prevAction.setEnabled(True) def closeBook(self): if self.ebook_info is not None and 'temp_path' in self.ebook_info: if exists(self.ebook_info['temp_path']): rmtree(self.ebook_info['temp_path']) self.ebook_info = None self.tocView.hide() self.prevAction.setEnabled(False) self.nextAction.setEnabled(False) def closeEvent(self, event = 0): if(event == 0): event = PyQt4.QtGui.QCloseEvent() self.closeBook() super(Lectern, self).closeEvent(event) # Suppress "cannot make invalid context current" warnings sys.exit(0) def navTo(self, index): navPoint = index.internalPointer() href = posixpath.join(self.ebook_info['temp_path'], self.ebook_info['opf_root'], navPoint.src) try: path, anchor = href.split('#') if path == self.webView.url().path(): self.webView.page().mainFrame().scrollToAnchor(anchor) return else: self.anchor = anchor except ValueError: pass url = QUrl.fromEncoded(href) self.webView.setUrl(url) def handleLoad(self, ok): if self.anchor is not None: self.webView.page().mainFrame().addToJavaScriptWindowObject("app", self); self.webView.page().mainFrame().scrollToAnchor(self.anchor) def handleTOCLoad(self, isEmpty): if isEmpty: self.tocView.hide() else: self.tocView.show()
class MapInput(QtGui.QWidget): def __init__(self): super(MapInput, self).__init__() self.initUI() def initUI(self): self.countries = [] self.existingChecks = [] self.K = Kartograph() self.CountryInput = QtGui.QLineEdit(self) #self.CountryList = QtGui.QTextEdit(self) #self.CountryList.setReadOnly(True) self.AddButton = QtGui.QPushButton("Add", self) self.AddButton.clicked.connect(self.buttonClicked) self.GenButton = QtGui.QPushButton('Generate', self) self.GenButton.clicked.connect(self.generateClicked) self.DispButton = QtGui.QPushButton('Display', self) self.DispButton.clicked.connect(self.displayClicked) self.statusBar = QtGui.QStatusBar(self) self.br = QtSvg.QGraphicsSvgItem("world.svg").boundingRect() self.scene = QtGui.QGraphicsScene() self.view = QtGui.QGraphicsView(self.scene) self.SvgItem = QtSvg.QGraphicsSvgItem("world.svg").boundingRect() self.webview = QGraphicsWebView() self.webview.load(QtCore.QUrl("world.svg")) self.webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape) self.webview.setCacheMode(QtGui.QGraphicsItem.NoCache) self.webview.resize(self.br.width(), self.br.height()) self.scene.addItem(self.webview) self.view.resize(self.br.width()+10, self.br.height()+10) self.grid = QtGui.QGridLayout() self.grid.setSpacing(10) self.bottomCheck = 4 self.grid.addWidget(self.AddButton, 1, 1) self.grid.addWidget(self.GenButton, 2, 1) self.grid.addWidget(self.DispButton, 3, 1) #grid.addWidget(self.CountryList, 4, 1) self.grid.addWidget(self.CountryInput, 1, 2) self.grid.addWidget(self.statusBar, 36, 0, 1, 3, QtCore.Qt.AlignBottom) self.grid.addWidget(self.view, 2, 2, 34, 50) self.setLayout(self.grid) #self.center() self.setWindowTitle('Map Display - Width ' + str(self.br.width()) + ', Height ' + str(self.br.height())) self.generateClicked() self.displayClicked() self.show() def buttonClicked(self): country = self.CountryInput.text() #add a check for if countries contains country #if not (self.countries.contains(country)): self.countries.append(country) self.generateClicked() self.displayClicked() self.CountryInput.setText('') self.countries = [c for c in self.countries if not c == ''] def generateClicked(self): self.generateMap(self.countries) #self.updateSB("Map generated.") self.statusBar.showMessage("Map generated.") def displayClicked(self): #add an SVG object to the main window, make this re-render that self.statusBar.showMessage("Displaying, please wait...") css = open('world2.css').read() cfg = options.read_map_config(open('world.json')) self.K.generate(cfg, outfile='world.svg', stylesheet=css, preview = False) self.webview.load(QtCore.QUrl("world.svg")) self.statusBar.showMessage("Map Displayed.") if self.CountryInput.text() and not self.CountryInput.text() in self.existingChecks: tempWidget = QtGui.QCheckBox(self.CountryInput.text(), self) tempWidget.toggle() tempWidget.stateChanged.connect(self.toggleDisplay) self.grid.addWidget(tempWidget, self.bottomCheck, 1) self.bottomCheck += 1 self.existingChecks.append(self.CountryInput.text()) self.updateCountryText() def generateMap(self, countrylist): self.generateCSS(countrylist) def generateCSS(self, countrylist): x = 0 css = open('world2.css', 'w') #print "css opened" css.write('#world {\n fill: #f5f3f2;\n},\n') css.write('#countries {\n fill: #f5f3f2;\n stroke: #882222;\n stroke-width: 0.5px;\n stroke-opacity: 0.4;\n}') for c in countrylist: countryString = ',\n#countries[name=%s]{\n fill: #ff0000;\n}' % c css.write(countryString) #print c #print x x+=x css.close() def toggleDisplay(self): senderText = self.sender().text() print self.sender().isChecked() if not self.sender().isChecked(): print self.sender().text() self.countries = [c for c in self.countries if not c == self.sender().text()] print self.countries if self.sender().isChecked(): self.countries.append(self.sender().text()) print self.countries self.buttonClicked() def updateCountryText(self): CountryList = self.countries displayString = QtCore.QString('') for country in CountryList: displayString.append(country) displayString.append('\n')
class ARPAP_SpatialReportDialogChart(QtGui.QDialog, FORM_CLASS): webview = None chartTypes = dict() algorithm = None reslayer = list() modelCategory = None modelValue = None validation = None chartGenerated = False mapChartType = {'bar':bar,'pie':pie} def __init__(self, parent=None): super(ARPAP_SpatialReportDialogChart, self).__init__(parent) self.parent = parent self.algorithm = parent.algorithm self.reslayer = parent.reslayer self.validation = ValidationInputdata(self,self.tr) self.setupUi(self) self.manageGui() def manageGui(self): self.chartGeneratorButton.setIcon(QtGui.QIcon(':/plugins/ARPAP_SpatialReport/icons/histogram.png')) self.statisticsGeneratorButton.setIcon(QtGui.QIcon(':/plugins/ARPAP_SpatialReport/icons/mActionOpenTable.png')) self.savePngFile.setIcon(QtGui.QIcon(':/plugins/ARPAP_SpatialReport/icons/mActionFileSave.png')) self.saveCSVFile.setIcon(QtGui.QIcon(':/plugins/ARPAP_SpatialReport/icons/mActionFileSave.png')) QObject.connect(self.chartGeneratorButton, SIGNAL('clicked()'),self.generateChart) QObject.connect(self.statisticsGeneratorButton, SIGNAL('clicked()'),self.generateStatistics) QObject.connect(self.savePngFile, SIGNAL('clicked()'),self.savepng) QObject.connect(self.saveCSVFile, SIGNAL('clicked()'),self.saveCSV) self.populateChartTypesCombo() self.populateCombosField() #manage resizeEvent QWebview def onResizeWebview(e): if self.chartGenerated: self.generateChart() self.graphicsView.resizeEvent = onResizeWebview def populateChartTypesCombo(self): self.chartTypes = { 'bar':self.tr('Bar (occurrences)'), 'pie':self.tr('Pie (distribution)'), } for type in self.chartTypes.keys(): self.selectChartType.addItem(self.chartTypes[type],type) def getChartType(self): return self.selectChartType.itemData(self.selectChartType.currentIndex()) def getSelectedListViewItem(self,listViewName): model_index = getattr(self,listViewName.lower()+'FieldListView').currentIndex() if model_index.row() != -1: return getattr(self,'model'+listViewName.capitalize()).itemFromIndex(model_index) def populateCombosField(self): layer = self.reslayer[0] #populate category listview self.modelCategory = QtGui.QStandardItemModel(self.categoryFieldListView) self.modelValue = QtGui.QStandardItemModel(self.valueFieldListView) self.categoryFieldListView.setModel(self.modelCategory) self.valueFieldListView.setModel(self.modelValue) for field in layer.pendingFields(): itemCategory = QtGui.QStandardItem(self.parent.formatFieldToString(field)) itemCategory.setData(field) itemValue = QtGui.QStandardItem(self.parent.formatFieldToString(field)) itemValue.setData(field) self.modelCategory.appendRow(itemCategory) self.modelValue.appendRow(itemValue) def _purificateValues(self,value): if type(value) == QDate: value = value.toString() elif type(value) == QPyNullVariant: value = None return value def generateChart(self): scene = QtGui.QGraphicsScene() self.graphicsView.setScene(scene) #select data adn chart type chartType = self.getChartType() if self.validation.validateChart(chartType): chart = self.mapChartType[chartType]() self.webview = QGraphicsWebView() self.webview.resize(self.graphicsView.width()-20,self.graphicsView.height()-20) path = os.path.dirname(__file__)+'/js/' chartData = getattr(self,chartType + 'ChartData' )() chart.setData(chartData) self.webview.setHtml(chart.getHTML(),baseUrl=QUrl().fromLocalFile(path)) self.webview.setFlags(QtGui.QGraphicsItem.ItemClipsToShape) self.webview.setCacheMode(QtGui.QGraphicsItem.NoCache) frame = self.webview.page().mainFrame() frame.setScrollBarPolicy(Qt.Vertical,Qt.ScrollBarAlwaysOff) frame.setScrollBarPolicy(Qt.Horizontal,Qt.ScrollBarAlwaysOff) scene.addItem(self.webview) self.graphicsView.show() self.savePngFile.setEnabled(True) self.chartGenerated = True else: self.showValidateErrors() def barChartData(self): categoryItem = self.getSelectedListViewItem('category') layer = self.reslayer[0] features = layer.getFeatures() occourences = dict() for f in features: value = self._purificateValues(f.attribute(categoryItem.data().name())) if value not in occourences: occourences[value] = 0 occourences[value] += 1 chartData = {'values':[{'label':k,'value':occourences[k]} for k in occourences.keys()]} return [chartData] def pieChartData(self): categoryItem = self.getSelectedListViewItem('category') valueItem = self.getSelectedListViewItem('value') layer = self.reslayer[0] features = layer.getFeatures() occourences = dict() totValue = 0 for f in features: key = f.attribute(categoryItem.data().name()) if not key: key = self.tr('Unknown') value = self._purificateValues(f.attribute(valueItem.data().name())) if key not in occourences: occourences[key] = 0 if not value: value = 0 occourences[key] += value totValue += value chartData = [{'key':k,'y':float(float(occourences[k])/float(totValue))} for k in occourences.keys()] return chartData def generateStatistics(self): categoryItem = self.getSelectedListViewItem('category') valueItem = self.getSelectedListViewItem('value') layer = self.reslayer[0] features = layer.getFeatures() occourences = dict() for f in features: key = self._purificateValues(f.attribute(categoryItem.data().name())) if not key: key = self.tr('Unknown') value = self._purificateValues(f.attribute(valueItem.data().name())) if key not in occourences: occourences[key] = list() if not value: value = 0 occourences[key].append(value) # statistics calcs self.statistics = dict() model = QtGui.QStandardItemModel(self.statisticsTableView) self.statisticsTableView.setModel(model) c = 0 self.headersFieldsTableMethods = { self.tr('Sum'):sum, self.tr('Min'):min, self.tr('Max'):max, self.tr('Median'):numpy.median, self.tr('Mean'):numpy.mean, self.tr('Standard deviation'):numpy.std } print occourences for columnName in self.headersFieldsTableMethods: model.setHorizontalHeaderItem(self.headersFieldsTableMethods.keys().index(columnName),QtGui.QStandardItem(columnName)) for key in occourences: if key not in self.statistics: self.statistics[key] = dict() rowToAppend = list() for func in self.headersFieldsTableMethods: self.statistics[key][func] = str(self.headersFieldsTableMethods[func](occourences[key])) rowToAppend.append(QtGui.QStandardItem(self.statistics[key][func])) model.appendRow(rowToAppend) model.setVerticalHeaderItem(c,QtGui.QStandardItem(str(key))) c += 1 self.saveCSVFile.setEnabled(True) def sum(self,data): return sum(data) def min(self,data): return min(data) def max(self,data): return max(data) def savepng(self): dialog = QtGui.QFileDialog() dialog.setAcceptMode(1) dialog.setDefaultSuffix("png") dialog.setNameFilters(["PNG files (*.png)", "All files (*)"]) if dialog.exec_() == 0: return pathFileToSave = dialog.selectedFiles()[0] p = QtGui.QPixmap.grabWidget(self.graphicsView) res = p.save(pathFileToSave) def saveCSV(self): dialog = QtGui.QFileDialog() dialog.setAcceptMode(1) dialog.setDefaultSuffix("csv") dialog.setNameFilters(["CSV files (*.csv)", "All files (*)"]) if dialog.exec_() == 0: return pathFileToSave = dialog.selectedFiles()[0] fileCSV = open(pathFileToSave, 'wb') compilatorCSV = csv.writer( fileCSV, delimiter=';' ) header = [''] header.extend(self.headersFieldsTableMethods.keys()) compilatorCSV.writerow(header) for i in self.statistics: row = [i] dataRow = [x.encode('utf-8') for x in self.statistics[i].values()] row.extend(dataRow) compilatorCSV.writerow(row) fileCSV.close() def showValidateErrors(self): QtGui.QMessageBox.warning( self, self.tr("ARPA Spatial Report"), self.tr( "Validation error:\n" ) + ';\n'.join(self.validation.getErrors()) )
class CamModule: def __init__(self): self.name = "Kamere" #Cam urls self.camUrls = {u"Ribčev Laz (v živo)": "http://firma.sportnet.si:8080/dvs2000/r1.jpg",\ u"Ribčev Laz": "http://www.bohinj.si/cam/slika3.jpg",\ u"Vogel - 1" : "http://www.snezni-telefon.si/Images/Kamere/6_a.jpg",\ u"Vogel - 2" : "http://www.snezni-telefon.si/Images/Kamere/6_b.jpg",\ u"Vogel - 3" : "http://www.snezni-telefon.si/Images/Kamere/6_c.jpg",\ u"Vogel - 4" : "http://www.snezni-telefon.si/Images/Kamere/6_d.jpg",\ u"Bohinjska Češnjica" : "http://www2.arnes.si/~smisma1/canon.jpg",\ u"Bohinjska Bistrica" : "http://www.drsc.si/kamere/kamslike/bohinjska/slike/boh1_0001.jpg",\ u"Orožnova koča": "http://www.bohinj.si/cam/lisc/slika1.jpg"} self.camSizes ={u"Ribčev Laz (v živo)": "352x228", \ u"Ribčev Laz": "2048x1536",\ u"Vogel - 1" : "1280x1024",\ u"Vogel - 2" : "640x480",\ u"Vogel - 3" : "1280x1024",\ u"Vogel - 4" : "640x480",\ u"Bohinjska Češnjica" : "800x600",\ u"Bohinjska Bistrica" : "352x228",\ u"Orožnova koča": "1280x1024"} self.updateTimer = QTimer() self.updateTimer.timeout.connect(self.update) def makeLayout(self): self.layout = QGraphicsLinearLayout(Qt.Vertical) self.topCamLayout = QGraphicsLinearLayout(Qt.Horizontal) # Cam layout self.camRefreshButton = Plasma.IconWidget() self.camRefreshButton.setIcon("view-refresh") self.camRefreshButton.clicked.connect(self.update) self.camTimeLabel = Plasma.Label() self.camTimeLabel.setText(u"ob") self.camEnlargeButton = Plasma.IconWidget() self.camEnlargeButton.setIcon("zoom-in") self.camEnlargeButton.clicked.connect(self.showFullCamWidget) self.camSelectorCombo = Plasma.ComboBox() for source in sorted(self.camUrls.keys()): self.camSelectorCombo.addItem(source) self.camSelectorCombo.setMinimumWidth(125) self.camSelectorCombo.textChanged.connect(self.camChanged) self.camView = QGraphicsWebView() self.camView.setEnabled(False) self.camTimeDataLabel = Plasma.Label() self.camUpdateTimeSelector = UpdateTimeSelector() self.camUpdateTimeSelector.setDefaultTime(30) self.camUpdateTimeSelector.setDefaultInterval('min') self.camUpdateTimeSelector.updateTimeSpin.valueChanged.connect(self.camTimeChanged) self.camUpdateTimeSelector.updateCheckBox.toggled.connect(self.camTimerToggle) self.topCamLayout.addItem(self.camSelectorCombo) self.topCamLayout.addItem(self.camTimeLabel) self.topCamLayout.addItem(self.camTimeDataLabel) self.topCamLayout.addStretch() self.topCamLayout.addItem(self.camEnlargeButton) self.topCamLayout.addItem(self.camRefreshButton) self.layout.addItem(self.topCamLayout) self.layout.addItem(self.camView) self.layout.addItem(self.camUpdateTimeSelector.layout) self.layout.itemAt(0).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType) self.layout.itemAt(2).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType) def update(self, text=None): try: urllib.urlopen('http://www.google.com', timeout=2) except: self.offlineMode() return if not self.camUpdateTimeSelector.updateCheckBox.isChecked(): self.updateTimer.stop() self.camChanged(self.camSelectorCombo.text()) self.setCamTimeLabel() def offlineMode(self): self.camView.setUrl(QUrl("weather-none-available.png")) self.camTimeDataLabel.setText(" ni na voljo.") def setCamTimeLabel(self): hour = time.localtime().tm_hour if not time.localtime().tm_hour in range(10) else '0' + str(time.localtime().tm_hour) minute = time.localtime().tm_min if not time.localtime().tm_min in range(10) else '0' + str(time.localtime().tm_min) second = time.localtime().tm_sec if not time.localtime().tm_sec in range(10) else '0' + str(time.localtime().tm_sec) self.camTimeDataLabel.setText(u'<b>%s:%s:%s</b>' % (str(hour), str(minute), str(second)) ) def camTimerToggle(self, toggled): if toggled: multiplier = 1 if self.camUpdateTimeSelector.getInterval() == 'min': multiplier = 60 if self.camUpdateTimeSelector.getInterval() == 'h': multiplier = 60 * 60 self.updateTimer.start(self.camUpdateTimeSelector.getTime() * 1000 * multiplier) self.update() else: self.updateTimer.stop() def camChanged(self, text): self.camView.setUrl( QUrl( self.camUrls[unicode(text)] ) ) self.setCamTimeLabel() def camTimeChanged(self, value): if self.camUpdateTimeSelector.isChecked(): self.updateTimer.stop() self.camTimerToggle(self.camUpdateTimeSelector.isChecked()) def showFullCamWidget(self): fullcamwidget = FullCamWidget() size = self.camSizes[unicode(self.camSelectorCombo.text())] size = [ int(i) for i in size.split('x')] if size[0] < 640 and size[1] < 480: fullcamwidget.show(self.camView.url(), size[0] + 25, size[1] + 125) else: fullcamwidget.show(self.camView.url(), 645, 505)
class FlowModule: def __init__(self): self.name = "Pretok" self.updateTimer = QTimer() self.updateTimer.timeout.connect(self.update) def makeLayout(self): self.layout = QGraphicsLinearLayout(Qt.Vertical) self.flowComboLayout = QGraphicsLinearLayout(Qt.Horizontal) self.flowLabelLayout = QGraphicsGridLayout() #Flow Layout self.flowData = SvJanez() self.flowView = QGraphicsWebView() self.flowView.setUrl( QUrl(self.flowData.flowImageUrl) ) self.flowView.setEnabled(False) self.flowSelectorCombo = Plasma.ComboBox() self.flowSelectorCombo.addItem(u"Sveti Janez") self.flowSelectorCombo.addItem(u"Soteska") self.flowSelectorCombo.setMinimumWidth(125) self.flowSelectorCombo.textChanged.connect(self.flowSourceChanged) self.flowRefresh = Plasma.IconWidget() self.flowRefresh.setIcon("view-refresh") self.flowRefresh.clicked.connect(self.update) self.flowEnlargeButton = Plasma.IconWidget() self.flowEnlargeButton.setIcon("zoom-in") self.flowEnlargeButton.clicked.connect(self.showFullFlowWidget) self.flowLabel = Plasma.Label() self.flowLabel.setText(u"<b>Pretok:</b> ") self.flowDataLabel = Plasma.Label() self.flowLevelLabel = Plasma.Label() self.flowLevelLabel.setText(u"<b>Višina:</b> ") self.flowLevelDataLabel = Plasma.Label() self.flowTempLabel = Plasma.Label() self.flowTempLabel.setText(u"<b>Temperatura:</b> ") self.flowTempDataLabel = Plasma.Label() self.flowLabelLayout.addItem(self.flowLevelLabel,0,0) self.flowLabelLayout.addItem(self.flowLevelDataLabel,0,1) self.flowLabelLayout.addItem(self.flowLabel,1,0) self.flowLabelLayout.addItem(self.flowDataLabel,1,1) self.flowLabelLayout.addItem(self.flowTempLabel,2,0) self.flowLabelLayout.addItem(self.flowTempDataLabel,2,1) self.flowUpdateTimeSelector = UpdateTimeSelector() self.flowUpdateTimeSelector.setDefaultTime(4) self.flowUpdateTimeSelector.setDefaultInterval('h') self.flowUpdateTimeSelector.updateTimeSpin.valueChanged.connect(self.flowTimeChanged) self.flowUpdateTimeSelector.updateCheckBox.toggled.connect(self.flowTimerToggle) self.flowComboLayout.addItem(self.flowSelectorCombo) self.flowComboLayout.addStretch() self.flowComboLayout.addItem(self.flowEnlargeButton) self.flowComboLayout.addItem(self.flowRefresh) self.layout.addItem(self.flowComboLayout) self.layout.addItem(self.flowView) self.layout.addItem(self.flowLabelLayout) self.layout.addStretch() self.layout.addItem(self.flowUpdateTimeSelector.layout) self.layout.itemAt(0).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType) self.layout.itemAt(2).setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed, QSizePolicy.DefaultType) def flowTimerToggle(self, toggled): if toggled: multiplier = 1 if self.flowUpdateTimeSelector.getInterval() == 'min': multiplier = 60 if self.flowUpdateTimeSelector.getInterval() == 'h': multiplier = 60 * 60 self.updateTimer.start(self.flowUpdateTimeSelector.getTime() * 1000 * multiplier) self.update() else: self.updateTimer.stop() def flowTimeChanged(self, value): if self.flowUpdateTimeSelector.isChecked(): self.updateTimer.stop() self.flowTimerToggle(self.flowUpdateTimeSelector.isChecked()) def flowSourceChanged(self, text): if text == "Sveti Janez": self.flowData = SvJanez() else: self.flowData = Soteska() self.flowView.setUrl(QUrl(self.flowData.flowImageUrl)) self.updateFlowLabels() def updateFlowImage(self): self.flowSourceChanged(self.flowSelectorCombo.text()) def updateFlowLabels(self): self.flowData.fetchData() self.flowDataLabel.setText(u"%s %s" % (self.flowData.currentFlow, u' m3/s')) self.flowTempDataLabel.setText(u"%s %s" % (self.flowData.temperature , u' °C')) self.flowLevelDataLabel.setText(u"%s %s" % (self.flowData.waterLevel , u' cm')) def update(self): try: urllib.urlopen('http://www.google.com', timeout=2) except: self.offlineMode() return self.updateFlowLabels() self.updateFlowImage() def offlineMode(self): self.flowView.setUrl(QUrl("weather-none-available.png")) self.flowDataLabel.setText(u"N/A") self.flowTempDataLabel.setText(u"N/A") self.flowLevelDataLabel.setText(u"N/A") def showFullFlowWidget(self): fullcamwidget = FullCamWidget() fullcamwidget.show(self.flowView.url(), 840, 400)
def paint(self, painter, option, widget): #from PyQt4.QtGui import QColor #painter.setPen(QColor(Qt.red)) #painter.drawRoundedRect(self.boundingRect(), 5, 5) QGraphicsWebView.paint(self, painter, option, widget)