def createWidgets(self): """ QtWidgets creation """ self.model = EventsTableModel2(hdrs=[ 'No.', 'Timestamp', 'From', 'To', 'Event Type', 'Component Type', 'Text' ]) if QtHelper.str2bool(Settings.instance().readValue( key='TestRun/auto-scrolling-textual')): self.activeAutoscrolling() self.proxyModel = MultiQSortFilterProxyModel(self) self.proxyModel.setDynamicSortFilter(True) self.setModel(self.proxyModel) self.setSortingEnabled(False) self.proxyModel.setSourceModel(self.model) self.setFrameShape(QFrame.NoFrame) self.setShowGrid(True) self.setSelectionMode(QAbstractItemView.SingleSelection) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setContextMenuPolicy(Qt.CustomContextMenu) self.verticalHeader().setVisible(False) self.horizontalHeader().setHighlightSections(False) self.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) self.setStyleSheet(""" gridline-color: white; selection-color: %s; selection-background-color: %s; """ % ( Settings.instance().readValue( key='TestRun/textual-text-selection-color'), Settings.instance().readValue( key='TestRun/textual-selection-color'), )) self.horizontalHeader().setStretchLastSection(True) self.setSortingEnabled(False) self.setColumnWidth(COL_NUM, 50) # No. self.setColumnWidth(COL_TIMESTAMP, 80) # timestamp self.setColumnWidth(COL_EVENT, 110) # timestamp self.setColumnWidth(COL_FROM, 150) # component widthFrom = Settings.instance().readValue( key='TestRun/column-from-width') self.setColumnWidth(COL_FROM_LEVEL, int(widthFrom)) # from widthTo = Settings.instance().readValue(key='TestRun/column-to-width') self.setColumnWidth(COL_TO_LEVEL, int(widthTo)) # to
def addStep(self, text, color="#A5A2A5", width=400, height=40, data=None, textBold=False, textItalic=False, timestamp="00:00:00"): """ Add step """ # take the last one if len(self.steps): latestBlock = self.steps[-1:][0] else: latestBlock = None newBlock = BlockItem(self, text, blockColor=color, width=width, height=height, data=data, bold=textBold, italic=textItalic) if width == 100: newBlock.setPos(400 / 2 - 100 / 2, len(self.steps) * 80) elif width == 300: newBlock.setPos(400 / 2 - 300 / 2, len(self.steps) * 80) else: newBlock.setPos(0, len(self.steps) * 80) self.steps.append(newBlock) self.diagramScene.addItem(newBlock) newTimestampBlock = TimestampItem(self, timestamp) newTimestampBlock.setPos(-200, len(self.timestamps) * 80) self.timestamps.append(newTimestampBlock) self.diagramScene.addItem(newTimestampBlock) if latestBlock is not None: newArrow = LineItem(latestBlock, newBlock) self.diagramScene.addItem(newArrow) self.arrows.append(newArrow) if QtHelper.str2bool(Settings.instance().readValue( key='TestRun/auto-scrolling-graph')): self.view.centerOn(newBlock) return newBlock
def __init__(self, parent=None): """ Qt Class User Client Interface Signals: * Notify @param parent: @type parent: """ QObject.__init__(self, parent) NetLayerLib.ClientAgent.__init__( self, typeAgent=NetLayerLib.TYPE_AGENT_USER, keepAliveInterval=int(Settings.instance().readValue( key='Network/keepalive-interval')), inactivityTimeout=int(Settings.instance().readValue( key='Network/inactivity-timeout')), timeoutTcpConnect=int(Settings.instance().readValue( key='Network/tcp-connect-timeout')), responseTimeout=int( Settings.instance().readValue(key='Network/response-timeout')), selectTimeout=float( Settings.instance().readValue(key='Network/select-timeout')), sslSupport=QtHelper.str2bool( Settings.instance().readValue(key='Server/data-ssl')), wsSupport=QtHelper.str2bool( Settings.instance().readValue(key='Server/data-websocket')), pickleVer=int( Settings.instance().readValue(key='Network/pickle-version')), tcpKeepAlive=QtHelper.str2bool( Settings.instance().readValue(key='Network/tcp-keepalive')), tcpKeepIdle=int( Settings.instance().readValue(key='Network/tcp-keepidle')), tcpKeepCnt=int( Settings.instance().readValue(key='Network/tcp-keepcnt')), tcpKeepIntvl=int( Settings.instance().readValue(key='Network/tcp-keepintvl'))) self.parent = parent
def setEditorData(self, editor, index): """ Set the editor @param value: @type value: @param value: @type value: """ # set editor data if sys.version_info > (3, ): # python 3 support value = index.data(Qt.DisplayRole) if isinstance(value, str): value = QtHelper.str2bool(value) else: value = index.data(Qt.DisplayRole).toBool() editor.setChecked(value)
def createWidgets (self): """ QtWidgets creation _______________________ | | | PyEditor | |_______________________| |________QSplitter______| | | | PyEditor | |_______________________| """ self.srcWidget = EditorWidget( self.TEST_UNIT_EDITOR, "Test Definition:", self, wrappingText=QtHelper.str2bool( Settings.instance().readValue( key = 'Editor/code-wrapping' ) ) ) self.srcEditor = self.srcWidget.editor layout = QVBoxLayout() layout.addWidget(self.srcWidget) layout.setContentsMargins(2,0,0,0) self.setLayout(layout)
def notifyReceived(self, data, fromLocal=False): """ Dispatch events @param data: @type data: dict """ if 'task-uuid' in data: self.taskUuid = data['task-uuid'] # normalize test id to str if 'script_id' in data: data['script_id'] = "%s" % data['script_id'] if 'tc_id' in data: data['tc_id'] = "%s" % data['tc_id'] if 'test-internal-id' in data: data['test-internal-id'] = "%s" % data['test-internal-id'] ############# Global events if data['event'] == 'script-started': self.parent.showMessageTray(msg='Test %s starting...' % self.name) self.isRunning = True #self.logsItem.activeReplay() self.parent.updateTabColor(self, color=QColor(Qt.darkCyan)) elif data['event'] == 'script-stopped': self.isRunning = False self.logsItem.deactiveKill() self.parent.updateTabColor(self, color=QColor(Qt.blue)) self.addGlobalTime(duration=float(data['duration'])) self.parent.showMessageTray(msg='Test %s terminated.' % self.name) # show the app if QtHelper.str2bool(Settings.instance().readValue( key='TestRun/show-test-terminated')): self.parent.setVisible(True) ############# test global events elif data['event'] == 'testglobal-started': self.isTp = True self.logsItem.activeKill() itemsSelected = self.logsItem.logs.selectedItems() if not len(itemsSelected): self.resumeView.reset() self.logsView.reset() self.tpTreeItem = self.logsItem.createRootItem( event=data, typeItem='testglobal') self.script[data['script_id']] = self.tpTreeItem elif data['event'] == 'testglobal-stopped': self.logsItem.deactiveKill() if self.isTp: self.logsItem.activeReplay() if not data['script_id'] in self.script: return # error rootTreeItem = self.script[data['script_id']] # new in 3.0.0 duration = None if 'duration' in data: duration = "%.3f" % float(data['duration']) self.logsItem.finishRootItem(rootItem=rootTreeItem, duration=duration, typeItem='testglobal', event=data) elif data['event'] == 'testglobal': if not data['script_id'] in self.scriptEvents: self.scriptEvents[data['script_id']] = [data] else: self.scriptEvents[data['script_id']].append(data) if not data['script_id'] in self.script: return itemsSelected = self.logsItem.logs.selectedItems() rootTreeItem = self.script[data['script_id']] if len(itemsSelected) > 1: rootTreeItem.setSelected(False) if rootTreeItem.isSelected(): self.logsView.setExpectedEventId(data['script_id']) row_pos = self.logsView.addEvent(event=data) self.resumeView.addEvent(event=data, rowp=row_pos, ihmId=row_pos) ############# test plan events elif data['event'] == 'testplan-separator-terminated': duration = "%.3f" % float(data['duration']) itemSeparator = self.separators[data['test-internal-id']] self.logsItem.finishTestplanSeparator(itemSep=itemSeparator, duration=duration) elif data['event'] == 'testplan-separator': itemsSelected = self.logsItem.logs.selectedItems() if not len(itemsSelected): self.logsView.reset() itemSeparator = self.logsItem.createTestplanSeparator(event=data) self.separators[data['test-internal-id']] = itemSeparator elif data['event'] == 'testplan-started': self.isTp = True self.logsItem.activeKill() itemsSelected = self.logsItem.logs.selectedItems() if not len(itemsSelected): self.resumeView.reset() self.logsView.reset() self.tpTreeItem = self.logsItem.createRootItem(event=data, typeItem='testplan') self.script[data['script_id']] = self.tpTreeItem elif data['event'] == 'testplan-stopped': self.logsItem.deactiveKill() if self.isTp: self.logsItem.activeReplay() if not data['script_id'] in self.script: return # error rootTreeItem = self.script[data['script_id']] # new in 3.0.0 duration = None if 'duration' in data: duration = "%.3f" % float(data['duration']) self.logsItem.finishRootItem(rootItem=rootTreeItem, duration=duration, typeItem='testplan', event=data) elif data['event'] == 'testplan': if not data['script_id'] in self.scriptEvents: self.scriptEvents[data['script_id']] = [data] else: self.scriptEvents[data['script_id']].append(data) if not data['script_id'] in self.script: return itemsSelected = self.logsItem.logs.selectedItems() rootTreeItem = self.script[data['script_id']] if len(itemsSelected) > 1: rootTreeItem.setSelected(False) if rootTreeItem.isSelected(): self.logsView.setExpectedEventId(data['script_id']) row_pos = self.logsView.addEvent(event=data) self.resumeView.addEvent(event=data, rowp=row_pos, ihmId=row_pos) ############# test abstract events elif data['event'] == 'testabstract-started': self.logsItem.activeKill() if self.tpTreeItem is not None: self.tpTreeItem.setSelected(False) itemsSelected = self.logsItem.logs.selectedItems() if not len(itemsSelected): self.resumeView.reset() self.logsView.reset() rootTreeItem = self.logsItem.createRootItem( event=data, typeItem='testabstract') self.script[data['script_id']] = rootTreeItem elif data['event'] == 'testabstract-stopped': if not self.isTp: self.logsItem.activeReplay() if not data['script_id'] in self.script: return # error rootTreeItem = self.script[data['script_id']] # new in 3.0.0 duration = None if 'duration' in data: duration = "%.3f" % float(data['duration']) self.logsItem.finishRootItem(rootItem=rootTreeItem, duration=duration, typeItem='testabstract', event=data) elif data['event'] == 'testabstract': if not data['script_id'] in self.scriptEvents: self.scriptEvents[data['script_id']] = [data] else: self.scriptEvents[data['script_id']].append(data) if not data['script_id'] in self.script: return rootTreeItem = self.script[data['script_id']] if rootTreeItem.isSelected(): self.logsView.setExpectedEventId(data['script_id']) row_pos = self.logsView.addEvent(event=data) self.resumeView.addEvent(event=data, rowp=row_pos, ihmId=row_pos) ############# test unit events elif data['event'] == 'testunit-started': self.logsItem.activeKill() if self.tpTreeItem is not None: self.tpTreeItem.setSelected(False) itemsSelected = self.logsItem.logs.selectedItems() if not len(itemsSelected): self.resumeView.reset() self.logsView.reset() rootTreeItem = self.logsItem.createRootItem(event=data, typeItem='testunit') self.script[data['script_id']] = rootTreeItem elif data['event'] == 'testunit-stopped': if not self.isTp: self.logsItem.activeReplay() if not data['script_id'] in self.script: return # error rootTreeItem = self.script[data['script_id']] # new in 3.0.0 duration = None if 'duration' in data: duration = "%.3f" % float(data['duration']) self.logsItem.finishRootItem(rootItem=rootTreeItem, duration=duration, typeItem='testunit', event=data) elif data['event'] == 'testunit': if not data['script_id'] in self.scriptEvents: self.scriptEvents[data['script_id']] = [data] else: self.scriptEvents[data['script_id']].append(data) if not data['script_id'] in self.script: return itemsSelected = self.logsItem.logs.selectedItems() rootTreeItem = self.script[data['script_id']] if len(itemsSelected) > 1: rootTreeItem.setSelected(False) if rootTreeItem.isSelected(): self.logsView.setExpectedEventId(data['script_id']) row_pos = self.logsView.addEvent(event=data) self.resumeView.addEvent(event=data, rowp=row_pos, ihmId=row_pos) ############# test suite events elif data['event'] == 'testsuite-started': self.logsItem.activeKill() if self.tpTreeItem is not None: self.tpTreeItem.setSelected(False) itemsSelected = self.logsItem.logs.selectedItems() if not len(itemsSelected): self.resumeView.reset() self.logsView.reset() rootTreeItem = self.logsItem.createRootItem(event=data) self.script[data['script_id']] = rootTreeItem elif data['event'] == 'testsuite-stopped': if not self.isTp: self.logsItem.activeReplay() if not data['script_id'] in self.script: return # error rootTreeItem = self.script[data['script_id']] # new in 3.0.0 duration = None if 'duration' in data: duration = "%.3f" % float(data['duration']) self.logsItem.finishRootItem(rootItem=rootTreeItem, duration=duration, event=data) elif data['event'] == 'testsuite': if not data['script_id'] in self.scriptEvents: self.scriptEvents[data['script_id']] = [data] else: self.scriptEvents[data['script_id']].append(data) if not data['script_id'] in self.script: return itemsSelected = self.logsItem.logs.selectedItems() rootTreeItem = self.script[data['script_id']] if len(itemsSelected) > 1: rootTreeItem.setSelected(False) if rootTreeItem.isSelected(): self.logsView.setExpectedEventId(data['script_id']) row_pos = self.logsView.addEvent(event=data) self.resumeView.addEvent(event=data, rowp=row_pos, ihmId=row_pos) ############# test case events elif data['event'] == 'testcase-started': if not data['script_id'] in self.script: return # error # rootTreeItem = self.script[data['script_id']] rootTreeItem.setSelected(False) itemsSelected = self.logsItem.logs.selectedItems() if not len(itemsSelected): self.graphView.reset() self.resumeView.reset() self.logsView.reset() testcaseTreeItem = self.logsItem.createTestcase( rootItem=rootTreeItem, event=data, fromLocal=fromLocal) self.testcases[data['tc_id']] = testcaseTreeItem elif data['event'] == 'testcase-stopped': if not data['tc_id'] in self.testcases: return # error # testcaseItem = self.testcases[data['tc_id']] testcaseItem.setSelected(False) # new in 3.0.0 duration = None if 'duration' in data: duration = "%.3f" % float(data['duration']) self.logsItem.finishTestcase(testcaseItem=testcaseItem, result=data['result'], duration=duration, event=data) elif data['event'] == 'testcase': # Issue 41: incorrect event displayed in test result # ignore invalid events if not data['script_id'] in self.script: return # error # if not data['tc_id'] in self.scriptEvents: self.scriptEvents[data['tc_id']] = [data] else: self.scriptEvents[data['tc_id']].append(data) if not data['tc_id'] in self.testcases: return itemsSelected = self.logsItem.logs.selectedItems() testcaseItem = self.testcases[data['tc_id']] if len(itemsSelected) > 1: testcaseItem.setSelected(False) if testcaseItem.isSelected(): self.logsView.setExpectedEventId(data['tc_id']) row_pos = self.logsView.addEvent(event=data) self.resumeView.addEvent(event=data, rowp=row_pos, ihmId=row_pos)
def createWidgets(self): """ QtWidgets creation ___________ _________________ | | | | | | | | | | | | | TestsItem | | TextualLogView | | | | | | | | | |___________| |_________________| """ layout = QHBoxLayout() self.logsItem = TestsView.TestsView(parent=self, local=self.local) self.resumeView = ResumeView.TextualView(parent=self) if QtHelper.str2bool( Settings.instance().readValue(key='TestRun/hide-resume-view')): self.hideResumeView() self.graphView = GraphView.FlowChartView(parent=self) self.logsView = TextualView.TextualView2(parent=self) self.hexLogsView = DetailedView.DetailedView(parent=self) self.displayTab = QTabWidget() hSplitter = QSplitter(self) hSplitter.setOrientation(Qt.Vertical) hSplitter.addWidget(self.resumeView) hSplitter.addWidget(self.logsView) hSplitter.addWidget(self.hexLogsView) self.displayTab.addTab(hSplitter, self.tr('Events')) self.displayTab.addTab(self.graphView, self.tr('Diagram')) defaultTab = Settings.instance().readValue( key='TestRun/default-tab-run') self.displayTab.setCurrentIndex(int(defaultTab)) self.currentEdit = QLineEdit() self.currentEdit.setReadOnly(True) self.currentEdit.setStyleSheet( "QLineEdit { background-color : #F0F0F0; color: grey; }") leftFrame = QFrame() leftLayout = QVBoxLayout() leftLayout.setContentsMargins(0, 0, 0, 0) leftFrame.setLayout(leftLayout) leftLayout.addWidget(self.currentEdit) leftLayout.addWidget(self.displayTab) v_splitter = QSplitter(self) v_splitter.addWidget(self.logsItem) v_splitter.addWidget(leftFrame) v_splitter.setStretchFactor(1, 1) layout.addWidget(v_splitter) self.setLayout(layout)
def createWidgets(self): """ Create all qt widgets """ self.setWindowTitle(self.tr("Extensive Testing Client - Web Browser")) self.setWindowIcon(QIcon(":/main.png")) self.dockToolbarWebBrowser = QToolBar(self) self.dockToolbarWebBrowser.setToolButtonStyle( Qt.ToolButtonTextBesideIcon) browserLayoutGroup = QVBoxLayout() browserLayoutGroup.addWidget(self.dockToolbarWebBrowser) toolbarBrowserLayoutGroup = QHBoxLayout() self.locationEdit = QLineEdit(self) self.locationEdit.setSizePolicy( QSizePolicy.Expanding, self.locationEdit.sizePolicy().verticalPolicy()) self.webCounter = QLabel("(0%)") toolbarBrowserLayoutGroup.addWidget(QLabel("Load URL:")) toolbarBrowserLayoutGroup.addWidget(self.webCounter) toolbarBrowserLayoutGroup.addWidget(self.locationEdit) self.webTitle = QLabel("Title:") self.webView = QWebView() if QtHelper.str2bool( Settings.instance().readValue(key='Server/proxy-web-active')): proxy = QNetworkProxy() proxy.setType(3) # http proxy.setHostName( Settings.instance().readValue(key='Server/addr-proxy-http')) proxy.setPort( int(Settings.instance().readValue( key='Server/port-proxy-http'))) self.webView.page().networkAccessManager().setProxy(proxy) if QT_VERSION_STR.startswith("4."): self.webInspector = QWebInspector() self.webView.settings().setAttribute( QWebSettings.DeveloperExtrasEnabled, True) self.webInspector.setPage(self.webView.page()) self.webView.setHtml( '<html><head></head><body>No content loaded</body></html>') self.webView.settings().setAttribute(QWebSettings.PluginsEnabled, True) self.webView.settings().setAttribute( QWebSettings.JavascriptCanOpenWindows, True) browserLayoutGroup.addLayout(toolbarBrowserLayoutGroup) browserLayoutGroup.addWidget(self.webTitle) self.webTab = QTabWidget() self.webTab.addTab(self.webView, "Web Page") if QT_VERSION_STR.startswith("4."): self.webTab.addTab(self.webInspector, "Source Inspector") browserLayoutGroup.addWidget(self.webTab) self.setLayout(browserLayoutGroup)
def keyPressEvent(self, event): """ Reimplement Qt method @param event: @type event: """ key = event.key() startLine, startPos, endLine, endPos = self.getSelection() line, index = self.getCursorPosition() cmd = self.text(line) if (key == Qt.Key_Tab): self.indent() event.accept() elif key == Qt.Key_Backtab: self.unindent() event.accept() else: # new in v13.1 t = event.text() # extract option from settings file autoCloseBracket = QtHelper.str2bool( Settings.instance().readValue(key='Editor/auto-close-bracket')) txt = cmd[:index].replace('>>> ', '').replace('... ', '') # new in v16 afterTxt = cmd[index:] if len(afterTxt): afterTxt = afterTxt.splitlines()[0] # end of new if t in self.opening and autoCloseBracket: i = self.opening.index(t) if self.hasSelectedText(): selText = self.selectedText() self.removeSelectedText() self.insert(self.opening[i] + selText + self.closing[i]) self.setCursorPosition(endLine, endPos + 2) return else: if len(afterTxt): pass elif t == '(' and (re.match(r'^[ \t]*def \w+$', txt) or re.match(r'^[ \t]*class \w+$', txt)): self.insert('):') else: self.insert(self.closing[i]) elif t in [')', ']', '}'] and autoCloseBracket: txt = self.text(line) try: if txt[index - 1] in self.opening and t == txt[index]: self.setCursorPosition(line, index + 1) self.SendScintilla(QsciScintilla.SCI_DELETEBACK) except IndexError: pass else: pass # end new in v13.1 QsciScintilla.keyPressEvent(self, event)
def createWidgets(self): """ QtWidgets creation QHBoxLayout -------------------------------------------..... | QLabel: QLineEdit QButton QButton QCheckBox | -------------------------------------------..... ....-------------------------------------- QLabel: QLineEdit QButton QCheckBox | ....-------------------------------------- """ glayout = QGridLayout() self.edit = QLineEditMore(parent=self) self.edit.setEditable(1) self.edit.setMaxCount(10) self.edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.edit.lineEdit().setPlaceholderText("Search text in your test?") self.edit.setMinimumWidth(200) self.replaceEdit = QComboBox(self) self.replaceEdit.setEditable(1) self.replaceEdit.setMaxCount(10) self.replaceEdit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.replaceEdit.lineEdit().setPlaceholderText( "Replace the text with?") self.replaceEdit.setMinimumWidth(200) self.caseCheck = QCheckBox(self.tr("Case Sensitive")) self.caseCheck.setChecked( QtHelper.str2bool(Settings.instance().readValue( key='Editor/find-case-sensitive'))) self.caseWordCheck = QCheckBox(self.tr("Whole word only")) self.caseWordCheck.setChecked( QtHelper.str2bool( Settings.instance().readValue(key='Editor/find-whole-word'))) self.allCheck = QCheckBox(self.tr("All occurences")) self.allCheck.setChecked( QtHelper.str2bool( Settings.instance().readValue(key='Editor/replace-all'))) self.caseRegexpCheck = QCheckBox(self.tr("Regular expression")) self.caseRegexpCheck.setChecked( QtHelper.str2bool( Settings.instance().readValue(key='Editor/find-regexp'))) self.caseWrapCheck = QCheckBox(self.tr("Wrap at the end")) self.caseWrapCheck.setChecked( QtHelper.str2bool( Settings.instance().readValue(key='Editor/find-wrap'))) glayout.addWidget(self.edit, 0, 1) glayout.addWidget(self.nextButton, 0, 3) glayout.addWidget(self.previousButton, 0, 2) glayout.addWidget(self.caseCheck, 2, 2) glayout.addWidget(self.caseWrapCheck, 2, 3) glayout.addWidget(self.caseWordCheck, 3, 2) glayout.addWidget(self.caseRegexpCheck, 3, 3) glayout.addWidget(self.replaceEdit, 1, 1) glayout.addWidget(self.replaceButton, 1, 2) glayout.addWidget(self.allCheck, 1, 3) self.previousButton.setDisabled(True) self.nextButton.setDisabled(True) self.setLayout(glayout) flags = Qt.WindowFlags() flags |= Qt.Window flags |= Qt.WindowTitleHint flags |= Qt.WindowCloseButtonHint flags |= Qt.MSWindowsFixedSizeDialogHint self.setWindowFlags(flags) self.setWindowIcon(QIcon(":/main.png")) self.setWindowTitle("Find And Replace")
def createWidgets(self): """ QtWidgets creation _________ _______________________ _________ / \__________ | | / \__ | | Q | | Q | | | WRepositories | S | | S | | | | p | | p | | |_____________________| l | | l | | _____QSplitter i | WDocumentViewer | i | WHelper | / \__________ t | | t | | | | t | | t | | | WDocumentProperties | e | | e | | | | r | | r | | |_____________________| |_______________________| |_____________| """ self.wCursorPosition = WCursorPosition(self) self.parent.addWidgetToStatusBar(self.wCursorPosition) WDocumentProperties.instance().setDisabled(True) layout = QHBoxLayout(self) # properties | viewer | helper self.vSplitter = QSplitter(self) if not QtHelper.str2bool( Settings.instance().readValue(key='View/tab-left')): self.hSplitter = QSplitter(self) self.hSplitter.setOrientation(Qt.Vertical) self.hSplitter.addWidget(WRepositories.instance()) self.hSplitter.addWidget(WDocumentProperties.instance()) self.hSplitter.setContentsMargins(0, 0, 0, 0) self.vSplitter.addWidget(self.hSplitter) else: WRepositories.instance().hideWidgetsHeader() WDocumentProperties.instance().hideWidgetsHeader() self.leftTab = QTabWidget(self) self.leftTab.addTab(WRepositories.instance(), QIcon(":/folders.png"), self.tr("Repositories")) self.leftTab.addTab(WDocumentProperties.instance(), QIcon(":/controls.png"), self.tr("Test Properties")) self.vSplitter.addWidget(self.leftTab) self.vSplitter.addWidget(WDocumentViewer.instance()) self.vSplitter.setStretchFactor(1, 1) layout.addWidget(self.vSplitter) self.hSplitter2 = QSplitter(self) self.hSplitter2.setOrientation(Qt.Vertical) self.vSplitter.addWidget(self.hSplitter2) self.hSplitter2.addWidget(WHelper.instance()) self.setLayout(layout)