class ScratchPadWidget(QtGui.QWidget): def __init__(self, parent): """ Constructor This widget is kind of different. It does not exactly subclass CustomWidget """ QtGui.QWidget.__init__(self) self.name = "Scratchpad" self.parent = parent self.config = self.parent.config self.iconp = self.config.icons_path self.icon = QIcon(self.iconp + 'pencil.png') self._createGui() def _createGui(self): self._createScratchPadWindow() scratchpad_layout = QtGui.QVBoxLayout() save_btn = QtGui.QPushButton("Save to file", self) save_btn.setIcon(QIcon(self.iconp + 'save-download.png')) label = QtGui.QLabel("Write some notes here") scratchpad_layout.addWidget(label) scratchpad_layout.addWidget(self.scratchpad_window) scratchpad_layout.addWidget(save_btn) # Connect signals and slots save_btn.clicked.connect(self._saveButtonClicked) self.setLayout(scratchpad_layout) def _createScratchPadWindow(self): """ Some binary analysis commands will output to this. """ self.scratchpad_window = QTextEdit() self.scratchpad_window.setFontPointSize(9) ################################################################# # GUI Callbacks def _saveButtonClicked(self): try: filename, flt = QFileDialog.getSaveFileName(self, "File to save notes", "", selectedFilter='*.txt') sp_text = self.scratchpad_window.toPlainText() with open(filename, 'w') as f: f.write(sp_text) print "Saved notes to \"%s\"" % filename except: print "[!] Problem saving notes..." print traceback.format_exc()
class Notepad(QWidget): def __init__(self, parent=None): super().__init__(parent) self._text_edit = QTextEdit() self._open_button = QPushButton(self.tr("&Open")) self._save_button = QPushButton(self.tr("&Save")) self._exit_button = QPushButton(self.tr("&Exit")) button_layout = QVBoxLayout() button_layout.addWidget(self._open_button) button_layout.addWidget(self._save_button) button_layout.addWidget(self._exit_button) button_layout.addStretch() main_layout = QHBoxLayout() main_layout.addWidget(self._text_edit) main_layout.addLayout(button_layout) self.setLayout(main_layout) self.setWindowTitle(self.tr('Notepad')) self._save_button.clicked.connect(self.save) self._open_button.clicked.connect(self.open) self._exit_button.clicked.connect(self.exit) def open(self): file_name = QFileDialog.getOpenFileName(self)[0] if file_name != '': try: with open(file_name, mode='rt') as in_file: text = in_file.read() self._text_edit.setText(text) except: QMessageBox.critical(self, self.tr('Error'), self.tr('Could not open file')) def save(self): file_name = QFileDialog.getSaveFileName(self)[0] if file_name != '': try: with open(file_name, mode='wt') as out_file: text = self._text_edit.toPlainText() out_file.write(text) except: QMessageBox.critical(self, self.tr('Error'), self.tr('Could not save file')) def exit(self): button = QMessageBox.question( self, self.tr('Notepad - Quit'), self.tr('Do you really want to quit?'), QMessageBox.Yes | QMessageBox.No) if button == QMessageBox.Yes: self.window().close()
class Notepad(QWidget): def __init__(self, parent=None): super().__init__(parent) self._text_edit = QTextEdit() self._open_button = QPushButton(self.tr("&Open")) self._save_button = QPushButton(self.tr("&Save")) self._exit_button = QPushButton(self.tr("&Exit")) button_layout = QVBoxLayout() button_layout.addWidget(self._open_button) button_layout.addWidget(self._save_button) button_layout.addWidget(self._exit_button) button_layout.addStretch() main_layout = QHBoxLayout() main_layout.addWidget(self._text_edit) main_layout.addLayout(button_layout) self.setLayout(main_layout) self.setWindowTitle(self.tr('Notepad')) self._save_button.clicked.connect(self.save) self._open_button.clicked.connect(self.open) self._exit_button.clicked.connect(self.exit) def open(self): file_name = QFileDialog.getOpenFileName(self)[0] if file_name != '': try: with open(file_name, mode='rt') as in_file: text = in_file.read() self._text_edit.setText(text) except: QMessageBox.critical(self, self.tr('Error'), self.tr('Could not open file')) def save(self): file_name = QFileDialog.getSaveFileName(self)[0] if file_name != '': try: with open(file_name, mode='wt') as out_file: text = self._text_edit.toPlainText() out_file.write(text) except: QMessageBox.critical(self, self.tr('Error'), self.tr('Could not save file')) def exit(self): button = QMessageBox.question(self, self.tr('Notepad - Quit'), self.tr('Do you really want to quit?'), QMessageBox.Yes | QMessageBox.No) if button == QMessageBox.Yes: self.window().close()
class LoggingArea(QWidget): def __init__(self, parent=None): super(LoggingArea, self).__init__() self.layout = QVBoxLayout(self) self.hbox_buttons_top = QHBoxLayout(self) self.button_start = QPushButton('Start Logging', self) self.button_start.clicked.connect(parent._start_logging) self.hbox_buttons_top.addWidget(self.button_start) self.button_stop = QPushButton('Stop Logging', self) self.button_stop.clicked.connect(parent._stop_logging) self.hbox_buttons_top.addWidget(self.button_stop) self.layout.addLayout(self.hbox_buttons_top) self.te_logging = QTextEdit(self) self.layout.addWidget(self.te_logging) self.hbox_buttons_bottom = QHBoxLayout(self) self.button_clear = QPushButton('Clear Data', self) self.button_clear.clicked.connect(self._clear_data) self.hbox_buttons_bottom.addWidget(self.button_clear) self.button_clipboard = QPushButton('Copy to Clipboard', self) self.button_clipboard.clicked.connect(self._copy_to_cliboard) self.hbox_buttons_bottom.addWidget(self.button_clipboard) # self.button_file = QPushButton('Save to CSV', self) # self.button_file.clicked.connect(self._save_to_csv) # # self.button_file.setEnabled(False) # self.hbox_buttons_bottom.addWidget(self.button_file) self.layout.addLayout(self.hbox_buttons_bottom) self.setLayout(self.layout) def _clear_data(self): self.te_logging.clear() def _copy_to_cliboard(self): self.te_logging.selectAll() self.te_logging.copy() def _save_to_csv(self): results = self.te_logging.toPlainText() print results
class Prozor(QWidget): def __init__(self,element): #kreiramo prozor QWidget.__init__(self) self.element = element #iskljucujemo polja za uvecanje i minimizaciju self.setWindowFlags(self.windowFlags() & ~Qt.WindowMaximizeButtonHint & ~Qt.WindowMinimizeButtonHint) #Podesavamo naslov self.setWindowTitle(self.element.ime) self.focusWidget() #editor teksta self.textEditor = QTextEdit() self.textEditor.setText(self.element.data) #dodajemo dugmad za primenu i odbacivanje promena #i povezujemo ih sa odgovarajucim funkcijama self.dugmeOk = QPushButton("Potvrdi") self.dugmeOtkazi = QPushButton("Otkazi") self.connect(self.dugmeOk,SIGNAL('clicked()'),self,SLOT('podesi()')) self.connect(self.dugmeOtkazi,SIGNAL('clicked()'),self,SLOT('zatvori()')) #formiramo raspored raspored = QFormLayout() raspored.addRow(self.textEditor) raspored.addRow(self.dugmeOtkazi,self.dugmeOk) self.setLayout(raspored) def zatvori(self): ''' Funkcija za dugme otkazi promene, vraca parametre liste na trenutno stanje aplikacije ''' self.textEditor.clear() self.textEditor.setText(self.element.data) self.hide() def podesi(self): ''' Funkcija za dugme potvrdi promene, poziva akcije za izmenu jezika i izgleda ''' self.element.data = self.textEditor.toPlainText() self.hide() def closeEvent(self, event): self.zatvori()
class AddDialogWidget(QDialog): """ A dialog to add a new address to the addressbook. """ def __init__(self, parent=None): super(AddDialogWidget, self).__init__(parent) nameLabel = QLabel("Name") addressLabel = QLabel("Address") buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.nameText = QLineEdit() self.addressText = QTextEdit() grid = QGridLayout() grid.setColumnStretch(1, 2) grid.addWidget(nameLabel, 0, 0) grid.addWidget(self.nameText, 0, 1) grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop) grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft) layout = QVBoxLayout() layout.addLayout(grid) layout.addWidget(buttonBox) self.setLayout(layout) self.setWindowTitle("Add a Contact") buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) # These properties make using this dialog a little cleaner. It's much # nicer to type "addDialog.address" to retrieve the address as compared # to "addDialog.addressText.toPlainText()" @property def name(self): return self.nameText.text() @property def address(self): return self.addressText.toPlainText()
class AddDialogWidget(QDialog): """ A dialog to add a new address to the addressbook. """ def __init__(self, parent=None): super(AddDialogWidget, self).__init__(parent) nameLabel = QLabel("Name") addressLabel = QLabel("Address") buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.nameText = QLineEdit() self.addressText = QTextEdit() grid = QGridLayout() grid.setColumnStretch(1, 2) grid.addWidget(nameLabel, 0, 0) grid.addWidget(self.nameText, 0, 1) grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop) grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft) layout = QVBoxLayout() layout.addLayout(grid) layout.addWidget(buttonBox) self.setLayout(layout) self.setWindowTitle("Add a Contact") buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) # These properties make using this dialog a little cleaner. It's much # nicer to type "addDialog.address" to retrieve the address as compared # to "addDialog.addressText.toPlainText()" @property def name(self): return self.nameText.text() @property def address(self): return self.addressText.toPlainText()
class ToolBox(QVBoxLayout): sig = QtCore.Signal(object) listThread = None groupBoxThreadInfo = None threadvbox = None mode = None def __init__(self, mode, parentQWidget = None): QVBoxLayout.__init__(self) self.sig.connect(self.addThreadList) self.mode = mode self.sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) self.groupBoxSearch = QGroupBox() self.groupBoxSearch.setStyleSheet("QGroupBox {border: 1px solid gray; border-radius: 4px; };") vboxSearch = QVBoxLayout() self.searchTitle = QLabel("Search Messages") vboxSearch.addWidget(self.searchTitle) self.searchHLayout = QHBoxLayout() self.editTextSearch = QTextEdit('') self.editTextSearch.setFixedSize(200,30) self.buttonSearch = QPushButton('Search') self.buttonSearch.setFixedSize(100,30) self.buttonSearch.clicked.connect(self.searchMsg) vboxSearch.addWidget(self.editTextSearch) self.searchHLayout.addWidget(self.buttonSearch) self.searchCursor = QLabel() self.searchHLayout.addWidget(self.searchCursor) vboxSearch.addLayout(self.searchHLayout) self.browseHLayout = QHBoxLayout() self.buttonLookUp = QPushButton('\u21e7') #Arrow up self.buttonLookUp.setFixedWidth(100) self.buttonLookUp.clicked.connect(self.moveToPrev) self.buttonLookDown = QPushButton('\u21e9') #Arrow down self.buttonLookDown.setFixedWidth(100) self.buttonLookDown.clicked.connect(self.moveToNext) self.browseHLayout.addWidget(self.buttonLookUp) self.browseHLayout.addWidget(self.buttonLookDown) vboxSearch.addLayout(self.browseHLayout) self.groupBoxSearch.setLayout(vboxSearch) self.addWidget(self.groupBoxSearch) self.groupBoxSearch.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)) self.buttonHiddenLifelines = QPushButton('Show hidden life-lines') self.buttonHiddenLifelines.setFixedWidth(200) self.buttonHiddenLifelines.clicked.connect(self.showHiddenLifelines) self.addWidget(self.buttonHiddenLifelines) self.buttonHiddenMessages = QPushButton('Show hidden Messages') self.buttonHiddenMessages.setFixedWidth(200) self.buttonHiddenMessages.clicked.connect(self.showHiddenMessages) self.addWidget(self.buttonHiddenMessages) if const.mode_interactive == mode: self.buttonCapture = QPushButton('Capture') self.buttonCapture.setFixedWidth(200) self.buttonCapture.clicked.connect(self.notifyCapture) self.addWidget(self.buttonCapture) self.msgRcv = [] self.msgInfo = QLabel("Message Info.") self.groupBoxMessageInfo = QGroupBox() self.groupBoxMessageInfo.setStyleSheet("QGroupBox {border: 1px solid gray; border-radius: 9px; margin-top: 0.5em} QGroupBox::title {subcontrol-origin: margin; left: 10px; padding: 0 3px 0 3px;") vbox = QVBoxLayout() vbox.addWidget(self.msgInfo) self.tableTime = QtGui.QTableWidget(3,2) self.tableTime.setHorizontalHeaderLabels(['-','time']) self.tableTime.setColumnWidth(0,80) self.tableTime.setColumnWidth(1,150) vwidth = self.tableTime.verticalHeader().length() hwidth = self.tableTime.horizontalHeader().height() fwidth = self.tableTime.frameWidth() * 2 self.tableTime.setFixedHeight(vwidth + hwidth + fwidth) self.tableTime.horizontalHeader().setStretchLastSection(True) self.tableTime.setItem(0,0,QTableWidgetItem('begin')) self.tableTime.setItem(0,1,QTableWidgetItem(' - ')) self.tableTime.setItem(1,0,QTableWidgetItem('end')) self.tableTime.setItem(1,1,QTableWidgetItem(' - ')) self.tableTime.setItem(2,0,QTableWidgetItem('duration')) self.tableTime.setItem(2,1,QTableWidgetItem(' - ')) vbox.addWidget(self.tableTime) self.titleArg = QLabel('Argument List') vbox.addWidget(self.titleArg) max_arg_num = 10 self.tableArgs = QtGui.QTableWidget(max_arg_num,2) self.tableArgs.setHorizontalHeaderLabels(['type','value']) for idx in range(0,max_arg_num): self.tableArgs.setItem(idx,0,QTableWidgetItem()) self.tableArgs.setItem(idx,1,QTableWidgetItem()) self.tableArgs.horizontalHeader().setStretchLastSection(True) vbox.addWidget(self.tableArgs) self.titleArg = QLabel('Return Value List') vbox.addWidget(self.titleArg) max_ret_num = 4 self.tableRet = QtGui.QTableWidget(max_ret_num,2) self.tableRet.setHorizontalHeaderLabels(['type','value']) for idx in range(0,max_ret_num): self.tableRet.setItem(idx,0,QTableWidgetItem()) self.tableRet.setItem(idx,1,QTableWidgetItem()) self.tableRet.horizontalHeader().setStretchLastSection(True) vwidth = self.tableRet.verticalHeader().length() hwidth = self.tableRet.horizontalHeader().height() fwidth = self.tableRet.frameWidth() * 2 self.tableRet.setFixedHeight(vwidth + hwidth + fwidth) vbox.addWidget(self.tableRet) self.buttonSrcView = QPushButton('view code') self.buttonSrcView.setFixedWidth(200) self.buttonSrcView.clicked.connect(self.openSourceViewer) self.buttonHide = QPushButton('Hide') self.buttonHide.setFixedWidth(200) self.buttonHide.clicked.connect(self.notifyHide) self.buttonHideAllMsg = QPushButton('Hide All') self.buttonHideAllMsg.setFixedWidth(200) self.buttonHideAllMsg.clicked.connect(self.hideAllMsgNamedAsSelected) self.groupBoxMessageInfo.setLayout(vbox) self.checkHideCircular = QCheckBox('Hide Circular Messages') self.checkHideCircular.setCheckState(QtCore.Qt.Unchecked) self.checkHideCircular.stateChanged.connect(self.changeHideCircularMessage) self.addWidget(self.checkHideCircular) self.addWidget(self.groupBoxMessageInfo) self.groupBoxMessageInfo.setSizePolicy(self.sizePolicy) def reset(self): for idx in reversed(range(0,self.listThread.count())): self.listThread.takeItem(idx) def setMsgInfoMessage(self,msg): self.strMessage = msg def changeHideCircularMessage(self,state): if state == QtCore.Qt.Unchecked: self.diagramView.hideCircularChanged(False) elif state == QtCore.Qt.Checked: self.diagramView.hideCircularChanged(True) def setMsgInfoModule(self,module): self.strModule = module def updateSearchStatus(self,curr,number): self.searchCursor.setText("%d/%d" % (curr,number)) def connectSourceViewer(self,viewer): self.srcViewer = viewer def openSourceViewer(self): self.srcViewer.openViewer(self.strModule,self.strMessage) def setMessageInfoTime(self,begin,end,duration): self.tableTime.item(0,1).setText(begin) self.tableTime.item(1,1).setText(end) self.tableTime.item(2,1).setText(duration + ' msec') def setMessageInfoArg(self,listParam,listArg): if listArg: for idx, text in enumerate(listArg): self.tableArgs.item(idx,1).setText(text) for idx, text in enumerate(listParam): self.tableArgs.item(idx,0).setText(text) else: for idx in range(0,self.tableArgs.rowCount()): self.tableArgs.item(idx,1).setText('') self.tableArgs.item(idx,0).setText('') def setMessageInfoRet(self,listRet): if listRet: for idx, text in enumerate(listRet): self.tableRet.item(idx,1).setText(text) else: for idx in range(0,self.tableRet.rowCount()): self.tableRet.item(idx,1).setText('') self.tableRet.item(idx,0).setText('') def notifyInteractiveStateChanged(self,state): if const.mode_interactive != self.mode: return if const.STATE_INTERACTIVE_CAPTURING == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Stop Capture') if const.STATE_INTERACTIVE_PROCESSING == state: self.buttonCapture.setEnabled(False) if const.STATE_INTERACTIVE_IDLE == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Capture') if const.STATE_INTERACTIVE_RESET == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Capture') elif const.STATE_INTERACTIVE_ACTIVE == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Capture') def setMessageInfo(self,info): self.msgInfo.setText(info) def setAvailable(self,threads): self.sig.emit(threads) def toggleThreadDisplay(self,item): print(self.listThread.currentRow()) #if item.isSelected(): # print(item.text() + " is selected") #else: # print(item.text() + " is not selected") self.diagramView.showThread(self.listThread.currentRow(),item.isSelected()) def hideAllMsgNamedAsSelected(self): self.diagramView.hideAllMessageSelected() def addThreadList(self,threads): if not self.groupBoxThreadInfo: self.groupBoxThreadInfo = QGroupBox() self.threadInfo = QLabel("Thread Info.") self.groupBoxThreadInfo.setStyleSheet("QGroupBox {border: 1px solid gray; border-radius: 9px; margin-top: 0.5em} QGroupBox::title {subcontrol-origin: margin; left: 10px; padding: 0 3px 0 3px;") if not self.threadvbox: self.threadvbox = QVBoxLayout() if not self.listThread: self.listThread = QListWidget() self.listThread.setFixedWidth(200) self.listThread.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) QtCore.QObject.connect(self.listThread, QtCore.SIGNAL("itemClicked(QListWidgetItem *)"), self.toggleThreadDisplay) self.threadvbox.addWidget(self.threadInfo) self.threadvbox.addWidget(self.listThread) self.groupBoxThreadInfo.setLayout(self.threadvbox) self.addWidget(self.groupBoxThreadInfo) self.groupBoxThreadInfo.setSizePolicy(self.sizePolicy) for id in threads: item = QtGui.QListWidgetItem(id) self.listThread.addItem(item) def connectController(self,controller): self.controller = controller self.connect(controller,QtCore.SIGNAL('setAvailable()'),self.setAvailable) def connectDiagramView(self,view): self.diagramView = view def disconnectMsgRcv(self,receiver): print("Implement this method !!! disconnectMsgRcv") def connectMsgRcv(self,receiver): self.msgRcv.append(receiver) def notifyHide(self): for rcv in self.msgRcv: rcv.activateHide(True) def showHiddenLifelines(self): response, selected_items = HiddenDialog.HiddenDialog.getSelectedItems(self.diagramView.getHiddenLifeLines()) if response: self.diagramView.showLifelines(selected_items) def showHiddenMessages(self): response, selected_items = HiddenMessageDialog.HiddenMessageDialog.getSelectedItems(self.diagramView.getHiddenMessages(),self.diagramView.getHiddenLifeLines()) if response: if selected_items[3] in self.diagramView.getHiddenLifeLines(): confirmation = ShowLifeLineDialog.ShowLifeLineDialog.confirmToShowLifeLine(selected_items[3]) if confirmation: self.diagramView.showLifelines([selected_items[3]]) self.diagramView.showMessages(selected_items) else: self.diagramView.showMessages(selected_items) def notifyCapture(self): for rcv in self.msgRcv: rcv.activateCapture(True) def moveToPrev(self): for rcv in self.msgRcv: rcv.moveToPrev() def moveToNext(self): for rcv in self.msgRcv: rcv.moveToNext() def searchMsg(self): str = self.editTextSearch.toPlainText() for rcv in self.msgRcv: rcv.searchMessage(str)
class App(QMainWindow): def __init__(self, parent=None): """Create Qt widgets, connect event handlers.""" super(App, self).__init__(parent) self.windowTitle = 'DMD | ' self.fileName = '' self.setWindowTitle(self.windowTitle + 'Unsaved File') exitAction = QAction('Exit', self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip('Exit application') exitAction.triggered.connect(self.close) openAction = QAction('Open', self) openAction.setShortcut('Ctrl+O') openAction.setStatusTip('Open Markdown File') openAction.triggered.connect(self.openFile) newAction = QAction('New', self) newAction.setShortcut('Ctrl+N') newAction.setStatusTip('New Markdown File') newAction.triggered.connect(self.newFile) saveAction = QAction('Save', self) saveAction.setShortcut('Ctrl+S') saveAction.setStatusTip('Save File') saveAction.triggered.connect(self.saveFile) self.statusBar() menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(newAction) fileMenu.addAction(openAction) fileMenu.addAction(saveAction) fileMenu.addAction(exitAction) self.setGeometry(300, 300, 1024, 768) self.show() self.txtInput = QTextEdit() self.txtInput.setTabStopWidth(20) self.webPreview = QWebView() self.webPreview.setHtml('Start typing...', baseUrl=QUrl('preview')) self.txtInput.textChanged.connect(self.loadPreview) splitter = QSplitter() splitter.addWidget(self.txtInput) splitter.addWidget(self.webPreview) self.setCentralWidget(splitter) def loadPreview(self): """Set the QWebView to the value of the parsed document.""" html = markdown2.markdown(self.txtInput.toPlainText()) self.webPreview.setHtml(html, baseUrl=QUrl('preview')) def openFile(self): """Handles opening a file, just like any other text editor.""" self.fileName = QFileDialog.getOpenFileName()[0] fh = open(self.fileName, 'r') contents = fh.read() fh.close() self.txtInput.setText(contents) self.setWindowTitle(self.windowTitle + self.fileName) def newFile(self): """Creates a new file, just like any other text editor.""" self.fileName = '' self.setWindowTitle(self.windowTitle + 'Unsaved File') self.txtInput.setText('') def saveFile(self): """Saves the file, just like any other text editor.""" if not self.fileName == '': fh = open(self.fileName, 'w') fh.write(self.txtInput.toPlainText()) fh.close() self.setWindowTitle(self.windowTitle + self.fileName) else: self.fileName = QFileDialog.getSaveFileName()[0] self.saveFile()
class addSignal(): def __init__(self, parent): self.parent = parent self.dialog = QDialog(self.parent.parent) mainLayout = QVBoxLayout() aux = QHBoxLayout() name = QLabel("Signal Name: ") self.nameBox = QLineEdit() aux.addWidget(name) aux.addWidget(self.nameBox) aux2 = QWidget() aux2.setLayout(aux) mainLayout.addWidget(aux2) auxBox = QHBoxLayout() self.fileLabel = QLabel("File: ") button = QPushButton("...") button.clicked.connect(self.fileChoosing) auxBox.addWidget(self.fileLabel) auxBox.addWidget(button) auxWidget = QWidget() auxWidget.setLayout(auxBox) mainLayout.addWidget(auxWidget) hBox = QHBoxLayout() hBox.addWidget(QLabel("Sample Rate (Hz): ")) self.sampleRate = QLineEdit() self.sampleRate.setText("60") hBox.addWidget(self.sampleRate) auxW = QWidget() auxW.setLayout(hBox) mainLayout.addWidget(auxW) auxBox = QHBoxLayout() commentaryLabel = QLabel("Commentary: ") self.commentaryBox = QTextEdit() auxBox.addWidget(commentaryLabel) auxBox.addWidget(self.commentaryBox) auxWidget = QWidget() auxWidget.setLayout(auxBox) mainLayout.addWidget(auxWidget) buttonOk = QPushButton("Add Signal") buttonOk.clicked.connect(self.addSignalClicked) mainLayout.addWidget(buttonOk) self.dialog.setLayout(mainLayout) self.dialog.show() def fileChoosing(self): filePicker = QFileDialog() self.fileName = filePicker.getOpenFileName(self.parent, 'Select File')[0] filePicker.destroy() self.fileLabel.setText("File: " + self.fileName) filePicker.destroy() def addSignalClicked(self): if self.fileName != "" and self.nameBox.text() != "": self.parent.parent.project.addSignal(self.nameBox.text(), self.fileName, self.commentaryBox.toPlainText(), self.sampleRate.text()) self.dialog.setVisible(False) label = self.parent.parent.project.signalList[-1][0].getImage() if self.parent.parent.table.columnCount() == 0: self.parent.parent.table.setColumnCount(1) self.parent.parent.table.setRowCount(self.parent.parent.table.rowCount() + 1) self.parent.parent.table.setCellWidget(len(self.parent.parent.project.signalList)-1,0,label) self.parent.parent.table.resizeColumnsToContents() self.parent.parent.table.resizeRowsToContents() self.parent.parent.setLabels() msg = QMessageBox(self.parent.parent) msg.setText("Signal added") msg.show()
class SampleWindow(QMainWindow): """ Our main window class """ def __init__(self,fileName=None): """ Constructor Function """ # QWidget.__init__(self) # self.setWindowTitle("Icon Sample") # self.setGeometry(300, 300, 200, 150) QMainWindow.__init__(self) self.setWindowTitle("Icon Sample") self.setGeometry(300, 300, 200, 150) QToolTip.setFont(QFont("Decorative", 8, QFont.Bold)) self.setToolTip('Our Main Window') self.icon='C:\Users\Hamed\Documents\soheil sites image\imageedit__9411602959.gif' self.textEdit = QTextEdit() self.setCentralWidget(self.textEdit) self.fileName = None self.filters = "Text files (*.txt)" openFile = QAction(QIcon('open.png'), 'Open', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Open new File') openFile.triggered.connect(self.showDialog) menubar = self.menuBar() # fileMenu = menubar.addMenu('&File') # fileMenu.addAction(openFile) self.setGeometry(300, 300, 350, 300) self.setWindowTitle('Example - File Dialog') # self.myNameLE = QLineEdit(self) # self.myAgeLE = QLineEdit(self) # self.myChoiceLE = QLineEdit(self) self.statusLabel = QLabel('Showing Progress') self.progressBar = QProgressBar() self.progressBar.setMinimum(0) self.progressBar.setMaximum(100) ##################@@@@@@@@@@@@@@2 self.threads = [] self.addWorker(MyWorkerThread(1)) self.addWorker(MyWorkerThread(2)) #######################@@@@@@@@@@@@@ self.show() ##########################@@@@@@@@@@ def addWorker(self, worker): worker.message.connect(self.printMessage, QtCore.Qt.QueuedConnection) # connect the finished signal to method so that we are notified worker.finished.connect(self.workersFinished) self.threads.append(worker) def startWorkers(self): for worker in self.threads: worker.start() # no wait, no finished. you start the threads and leave. def workersFinished(self): if all(worker.isFinished() for worker in self.threads): # wait until all the threads finished QtCore.QCoreApplication.instance().quit() @QtCore.Slot(str) def printMessage(self, text): sys.stdout.write(text+'\n') sys.stdout.flush() ################################ def openAbout(self): aboutDialog = QtGui.QDialog(self) # aboutUi = about.About_Dialog() # aboutUi.setupUi(aboutDialog) aboutDialog.show() def newwindow(self): # w = W1() # w.show() # self.hide() # form = Form() # form.show() w2 = chooseoption.Form1(self) w2.show() import webbrowser your_swf_url='E:\soheil\web_site_root\ieee\all_functions\linux server\python GUI\Double_angle_off.swf' webbrowser.open(your_swf_url) # self.wid = QWidget() # self.wid.resize(250, 150) # self.wid.setWindowTitle('NewWindow') # self.wid.show() # self.actionAbout.triggered.connect(self.openAbout) def retranslateUi(self, Dialog): Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) self.aboutLbl.setText(QtGui.QApplication.translate("Dialog", "Mailer version 0.0.1 by .....", None, QtGui.QApplication.UnicodeUTF8)) def showNameDialog(self): text, ok = QInputDialog.getText(self, 'Input Text Dialog', 'Enter your name:') if ok: self.myNameLE.setText(str(text)) def showDialog(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open Text Files", "c:/", "Text files(*.txt)") try: contents = open(fileName, 'r') with contents: data = contents.read() self.textEdit.setText(data) except: pass def CreateStatusBar(self): """ Function to create the status bar """ self.myStatusBar = QStatusBar() self.progressBar.setValue(10) self.myStatusBar.addWidget(self.statusLabel, 1) self.myStatusBar.addWidget(self.progressBar, 2) self.setStatusBar(self.myStatusBar) def ShowProgress(self): """ Function to show progress """ import time while(self.progressBar.value() < self.progressBar.maximum()): self.progressBar.setValue(self.progressBar.value() + 10) # time.sleep(1) self.statusLabel.setText('Ready') def SetupComponents(self): """ Function to setup status bar, central widget, menu bar """ self.myStatusBar = QStatusBar() self.setStatusBar(self.myStatusBar) self.myStatusBar.showMessage('Ready', 10000) self.textEdit = QTextEdit() self.setCentralWidget(self.textEdit) # self.CreateActions() # self.CreateMenus() # self.fileMenu.addAction(self.newAction) # self.fileMenu.addSeparator() # self.fileMenu.addAction(self.exitAction) # self.editMenu.addAction(self.copyAction) # self.fileMenu.addSeparator() # self.editMenu.addAction(self.pasteAction) # self.helpMenu.addAction(self.aboutAction) self.myStatusBar = QStatusBar() self.setStatusBar(self.myStatusBar) self.myStatusBar.showMessage('Ready', 10000) self.CreateActions() self.CreateMenus() self.CreateToolBar() self.fileMenu.addAction(self.newAction) self.fileMenu.addAction(self.openAction) self.fileMenu.addAction(self.saveAction) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAction) self.editMenu.addAction(self.cutAction) self.editMenu.addAction(self.copyAction) self.editMenu.addAction(self.pasteAction) self.editMenu.addSeparator() self.editMenu.addAction(self.undoAction) self.editMenu.addAction(self.redoAction) self.editMenu.addAction(self.ss_image) self.editMenu.addSeparator() self.editMenu.addAction(self.selectAllAction) self.formatMenu.addAction(self.fontAction) self.helpMenu.addAction(self.aboutAction) self.helpMenu.addSeparator() self.helpMenu.addAction(self.aboutQtAction) self.mainToolBar.addAction(self.newAction) self.mainToolBar.addAction(self.openAction) self.mainToolBar.addAction(self.saveAction) self.mainToolBar.addSeparator() self.mainToolBar.addAction(self.cutAction) self.mainToolBar.addAction(self.copyAction) self.mainToolBar.addAction(self.pasteAction) self.mainToolBar.addSeparator() self.mainToolBar.addAction(self.undoAction) self.mainToolBar.addAction(self.redoAction) def openFile(self): self.fileName, self.filterName =QFileDialog.getOpenFileName(self) try: self.textEdit.setText(open(self.fileName).read()) except: pass # Slots called when the menu actions are triggered def newFile(self): self.textEdit.setText('') def exitFile(self): self.close() def aboutHelp(self): QMessageBox.about(self, "About Simple Text Editor", "This example demonstrates the use " "of Menu Bar") def fontChange(self): (font, ok) = QFontDialog.getFont(QFont("Helvetica [Cronyx]", 10), self) if ok: self.textEdit.setCurrentFont(font) def saveFile(self): if self.fileName == None or self.fileName == '': self.fileName, self.filterName = QFileDialog.getSaveFileName(self, \ filter=self.filters) if(self.fileName != ''): file = open(self.fileName, 'w') file.write(self.textEdit.toPlainText()) self.statusBar().showMessage("File saved", 2000) def image_ss(self): from PySide import QtGui, QtCore import wxpython_flash_Simple_working hbox = QtGui.QHBoxLayout(self) pixmap = QtGui.QPixmap('C:\Users\Hamed\Pictures\LED\led.jpg') 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() # from PIL import Image # from PySide.QtGui import QImage, QImageReader, QLabel, QPixmap, QApplication # # im = Image.open('C:\Users\Hamed\Documents\soheil sites image\imageedit__9411602959.gif') # data = im.tostring('raw') # ##app = QApplication([]) ## image = QImage(data); # image = QImage(data, im.size[0], im.size[1], QImage.Format_ARGB32) # pix = QPixmap.fromImage(image) # lbl = QLabel() # lbl.setPixmap(pix) # lbl.show() def image_ss_main(self): from PySide import QtGui, QtCore hbox = QtGui.QHBoxLayout(self) pixmap = QtGui.QPixmap('C:\Users\Hamed\Pictures\LED\led.jpg') 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() # from PIL import Image # from PySide.QtGui import QImage, QImageReader, QLabel, QPixmap, QApplication # # im = Image.open('C:\Users\Hamed\Documents\soheil sites image\imageedit__9411602959.gif') # data = im.tostring('raw') # ##app = QApplication([]) ## image = QImage(data); # image = QImage(data, im.size[0], im.size[1], QImage.Format_ARGB32) # pix = QPixmap.fromImage(image) # lbl = QLabel() # lbl.setPixmap(pix) # lbl.show( def CreateActions(self): """ Function to create actions for menus """ self.newAction = QAction( QIcon('new.png'), '&New', self, shortcut=QKeySequence.New, statusTip="Create a New File", triggered=self.newFile) self.exitAction = QAction( QIcon(self.icon), 'E&xit', self, shortcut="Ctrl+Q", statusTip="Exit the Application", triggered=self.exitFile) self.copyAction = QAction( QIcon('copy.png'), 'C&opy', self, shortcut="Ctrl+C", statusTip="Copy", triggered=self.textEdit.copy) self.pasteAction = QAction( QIcon('paste.png'), '&Paste', self, shortcut="Ctrl+V", statusTip="Paste", triggered=self.textEdit.paste) self.aboutAction = QAction( QIcon('about.png'), 'A&bout', self, statusTip="Displays info about text editor", triggered=self.aboutHelp) self.openAction = QAction( QIcon('open.png'), 'O&pen', self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.openFile) self.saveAction = QAction( QIcon('save.png'), '&Save', self, shortcut=QKeySequence.Save, statusTip="Save the current file to disk", triggered=self.saveFile) self.cutAction = QAction( QIcon('cut.png'), 'C&ut', self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection to clipboard", triggered=self.textEdit.cut) self.undoAction = QAction( QIcon('undo.png'),'Undo', self, shortcut=QKeySequence.Undo, statusTip="Undo previous action", triggered=self.textEdit.undo) self.redoAction = QAction( QIcon('redo.png'),'Redo', self, shortcut=QKeySequence.Redo, statusTip="Redo previous action", triggered=self.textEdit.redo) self.selectAllAction = QAction( QIcon('selectAll.png'), 'Select All', self, statusTip="Select All", triggered=self.textEdit.selectAll) self.fontAction = QAction( 'F&ont', self, statusTip = "Modify font properties", triggered = self.fontChange) self.aboutAction = QAction( QIcon('about.png'), 'A&bout', self, statusTip="Displays info about text editor", # triggered=self.aboutHelp) triggered=self.newwindow) self.aboutQtAction = QAction("About &Qt", self, statusTip="Show the Qt library's About box", triggered=qApp.aboutQt) self.ss_image = QAction("Insert &.SWF(flash)", self, statusTip="Show the Qt library's About box", triggered=self.image_ss) self.actionAbout = QAction("image &Qt", self, statusTip="Show the Qt library's About box", triggered=self.openAbout) # Actual menu bar item creation def CreateToolBar(self): """ Function to create actual menu bar """ self.mainToolBar = self.addToolBar('Main') self.mainToolBar.addAction(self.newAction) self.mainToolBar.addSeparator() self.mainToolBar.addAction(self.copyAction) self.mainToolBar.addAction(self.pasteAction) # Actual menu bar item creation def CreateMenus(self): """ Function to create actual menu bar """ self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addSeparator() self.editMenu = self.menuBar().addMenu("&Edit") self.helpMenu = self.menuBar().addMenu("&Help") self.formatMenu = self.menuBar().addMenu("F&ormat") def setAboutButton(self): """ Function to set About Button """ self.aboutButton = QPushButton("About", self) self.aboutButton.move(110, 100) self.aboutButton.clicked.connect(self.showAbout) def showAbout(self): """ Function to show About Box """ QMessageBox.about(self.aboutButton, "About PySide", "PySide is a cross-platform tool for generating GUI Programs.") def center(self): """ Function to center the application """ qRect = self.frameGeometry() centerPoint = QDesktopWidget().availableGeometry().center() qRect.moveCenter(centerPoint) self.move(qRect.topLeft()) def quitApp(self): """ Function to confirm a message from the user """ userInfo = QMessageBox.question(self, 'Confirmation', "This will quit the application. Do you want to Continue?", QMessageBox.Yes | QMessageBox.No) if userInfo == QMessageBox.Yes: myApp.quit() if userInfo == QMessageBox.No: pass def setIconModes(self): myIcon1 = QIcon( self.icon) myLabel1 = QLabel('sample', self) pixmap1 = myIcon1.pixmap(50, 50, QIcon.Active, QIcon.On) myLabel1.setPixmap(pixmap1) myIcon2 = QIcon( self.icon) myLabel2 = QLabel('sample', self) pixmap2 = myIcon2.pixmap(50, 50, QIcon.Disabled, QIcon.Off) myLabel2.setPixmap(pixmap2) myLabel2.move(50, 0) myIcon3 = QIcon( self.icon) myLabel3 = QLabel('sample', self) pixmap3 = myIcon3.pixmap(50, 50, QIcon.Selected, QIcon.On) myLabel3.setPixmap(pixmap3) myLabel3.move(100, 0) def setIcon(self): """ Function to set Icon """ from PySide.QtGui import QPixmap pixmap = QPixmap(r'C:\Users\Hamed\Pictures\LED\led.jpg') # appIcon = QIcon('C:\Users\Hamed\Documents\soheil sites image\imageedit__9411602959.gif') appIcon = QIcon(pixmap) self.setWindowIcon(appIcon) def setButton(self): """ Function to add a quit button """ myButton = QPushButton('Quit', self) myButton.move(20, 100) # myButton.clicked.connect(myApp.quit) myButton.clicked.connect(self.quitApp)
class Ui_MainWindow(QMainWindow): """Cette classe contient tous les widgets de notre application.""" defaultPalette = QPalette() defaultPalette.setColor(QPalette.Base, QColor("#151515")) defaultPalette.setColor(QPalette.Text, Qt.white) def __init__(self): super(Ui_MainWindow, self).__init__() # initialise la GUI avec un exemple self.text = "Ceci est un petit texte d'exemple." # les variables sont en place, initialise la GUI self.initUI() # exécute l'exemple self.orgText.setText(self.text) self.encode_text(False) self.logLab.setText( u"Saisir du texte ou importer un fichier, puis pousser \n" u"le bouton correspondant à l'opération souhaitée.") def initUI(self): """Met en place les éléments de l'interface.""" # -+++++++------------------- main window -------------------+++++++- # self.setWindowTitle(u"Encodage / Décodage de Huffman") self.centerAndResize() centralwidget = QWidget(self) mainGrid = QGridLayout(centralwidget) mainGrid.setColumnMinimumWidth(0, 450) # -+++++++------------------ groupe analyse -----------------+++++++- # analysGroup = QGroupBox(u"Analyse", centralwidget) self.analysGrid = QGridLayout(analysGroup) # ----------- groupe de la table des codes ---------- # codeTableGroup = QGroupBox(u"Table des codes", analysGroup) codeTableGrid = QGridLayout(codeTableGroup) # un tableau pour les codes self.codesTableModel = MyTableModel() self.codesTable = QTableView(codeTableGroup) self.codesTable.setModel(self.codesTableModel) self.codesTable.setFont(QFont("Mono", 8)) self.codesTable.resizeColumnsToContents() self.codesTable.setSortingEnabled(True) codeTableGrid.addWidget(self.codesTable, 0, 0, 1, 1) self.analysGrid.addWidget(codeTableGroup, 1, 0, 1, 1) # ----------- label du ratio de compression ---------- # self.ratioLab = QLabel(u"Ratio de compression: ", analysGroup) font = QFont() font.setBold(True) font.setWeight(75) font.setKerning(True) self.ratioLab.setFont(font) self.analysGrid.addWidget(self.ratioLab, 2, 0, 1, 1) # -+++++++-------- groupe de la table de comparaison --------+++++++- # self.compGroup = QGroupBox(analysGroup) self.compGroup.setTitle(u"Comparaisons") compGrid = QGridLayout(self.compGroup) # un tableau pour le ratio self.compTable = QTableWidget(self.compGroup) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.compTable.sizePolicy().hasHeightForWidth()) self.compTable.setSizePolicy(sizePolicy) self.compTable.setBaseSize(QSize(0, 0)) font = QFont() font.setWeight(50) self.compTable.setFont(font) self.compTable.setEditTriggers(QAbstractItemView.NoEditTriggers) self.compTable.setShowGrid(True) self.compTable.setGridStyle(Qt.SolidLine) # lignes / colonnes self.compTable.setColumnCount(2) self.compTable.setRowCount(3) self.compTable.setVerticalHeaderItem(0, QTableWidgetItem("Taille (bits)")) self.compTable.setVerticalHeaderItem(1, QTableWidgetItem("Entropie")) self.compTable.setVerticalHeaderItem(2, QTableWidgetItem("Taille moy. (bits)")) for i in range(2): self.compTable.verticalHeaderItem(i).setTextAlignment( Qt.AlignRight) self.compTable.setHorizontalHeaderItem(0, QTableWidgetItem("ASCII")) self.compTable.setHorizontalHeaderItem(1, QTableWidgetItem("Huffman")) # nom des items self.compTabASCIIMem = QTableWidgetItem() self.compTable.setItem(0, 0, self.compTabASCIIMem) self.compTabASCIIEnt = QTableWidgetItem() self.compTable.setItem(1, 0, self.compTabASCIIEnt) self.compTabASCIIAvg = QTableWidgetItem() self.compTable.setItem(2, 0, self.compTabASCIIAvg) self.compTabHuffMem = QTableWidgetItem() self.compTable.setItem(0, 1, self.compTabHuffMem) self.compTabHuffEnt = QTableWidgetItem() self.compTable.setItem(1, 1, self.compTabHuffEnt) self.compTabHuffAvg = QTableWidgetItem() self.compTable.setItem(2, 1, self.compTabHuffAvg) # parem du tableau self.compTable.horizontalHeader().setCascadingSectionResizes(False) self.compTable.verticalHeader().setVisible(True) font = QFont("Mono", 8) self.compTable.setFont(font) compGrid.addWidget(self.compTable, 1, 0, 1, 1) self.analysGrid.addWidget(self.compGroup, 0, 0, 1, 1) mainGrid.addWidget(analysGroup, 0, 1, 1, 1) # -+++++++----------------- groupe du texte -----------------+++++++- # groupBox = QGroupBox(u"Texte", centralwidget) textGrid = QGridLayout(groupBox) # -+++++++------------- groupe du texte original ------------+++++++- # orgTextGroup = QGroupBox(u"Texte original (Ctrl+T)", groupBox) orgTextGrid = QGridLayout(orgTextGroup) self.orgText = QTextEdit(orgTextGroup) self.orgText.setPalette(self.defaultPalette) orgTextGrid.addWidget(self.orgText, 0, 0, 1, 1) textGrid.addWidget(orgTextGroup, 0, 0, 1, 2) # -+++++++------------ groupe du texte compressé ------------+++++++- # compressedTextGroup = QGroupBox(u"Texte compressé (Ctrl+H)", groupBox) compressedTextGrid = QGridLayout(compressedTextGroup) self.compressedText = QTextEdit(compressedTextGroup) self.compressedText.setPalette(self.defaultPalette) compressedTextGrid.addWidget(self.compressedText, 0, 0, 1, 1) textGrid.addWidget(compressedTextGroup, 1, 0, 1, 2) # -+++++++------------ groupe pour le texte ascii -----------+++++++- # asciiTextGroup = QGroupBox(u"Texte ASCII", groupBox) asciiTextGrid = QGridLayout(asciiTextGroup) self.asciiText = QTextBrowser(asciiTextGroup) self.asciiText.setPalette(self.defaultPalette) asciiTextGrid.addWidget(self.asciiText, 0, 0, 1, 1) textGrid.addWidget(asciiTextGroup, 2, 0, 1, 2) # -+++++++-------------------- label de log -----------------+++++++- # self.logLab = QLabel(analysGroup) textGrid.addWidget(self.logLab, 3, 0, 1, 2) # -+++++++----------- bouton pour encoder le texte ----------+++++++- # self.encodeBut = QPushButton(groupBox) self.encodeBut.setStatusTip( u"Cliquez sur ce bouton pour encoder le texte original.") self.encodeBut.setText(u"ENCODER") self.encodeBut.clicked.connect(self.encode_text) textGrid.addWidget(self.encodeBut, 4, 0, 1, 1) # -+++++++----------- bouton pour décoder le texte ----------+++++++- # self.decodeBut = QPushButton(groupBox) self.decodeBut.setStatusTip( u"Cliquez sur ce bouton pour décoder le texte compressé.") self.decodeBut.setText(u"DÉCODER") self.decodeBut.clicked.connect(self.decode_text) textGrid.addWidget(self.decodeBut, 4, 1, 1, 1) mainGrid.addWidget(groupBox, 0, 0, 1, 1) self.setCentralWidget(centralwidget) # -+++++++--------------- une barre de statut ---------------+++++++- # self.setStatusBar(QStatusBar(self)) # -+++++++--------------------- le menu ---------------------+++++++- # self.fileMenu = QMenu(u"Fichier") self.fileMenu.addAction(u"Importer un texte...", self.open_text) self.fileMenu.addAction( u"Importer un texte encodé...", lambda: self.open_text(True)) self.fileMenu.addAction(u"Importer un dictionnaire...", self.open_dict) self.fileMenu.addAction(u"Enregistrer le dictionnaire...", self.save_dict) self.fileMenu.addAction(u"Quitter", self.close) self.menuBar().addMenu(self.fileMenu) QMetaObject.connectSlotsByName(self) def open_text(self, compressed=False): """Ouvrir un fichier contenant un texte compressé ou non.""" fname, _ = QFileDialog.getOpenFileName(self, u'Ouvrir') f = open(fname, 'r') with f: data = f.read() if compressed: self.compressedText.setText(data) else: self.orgText.setText(data) def open_dict(self): """Ouvrir un dictionnaire de codes Huffman.""" fname, _ = QFileDialog.getOpenFileName(self, u'Ouvrir') self.occ = {} self.hCodes = {} self.aCodes = {} self.hCost = {} self.aCost = {} self.hCodes = create_dict_from_file(fname) self.update_codes_table() self.logLab.setText(u"Dictionnaire de Huffman importé.") return self.hCodes def save_dict(self): """Enregistrer le dictionnaire de codes Huffman.""" fname, _ = QFileDialog.getSaveFileName(self, "Enregistrer sous") save_dict_to_file(fname, self.hCodes) def make_tab_rows(self): """Génère le remplissage des lignes du tableau des codes.""" dictList = [self.occ, self.aCodes, self.hCodes, self.aCost, self.hCost] tabList = [] charList = self.hCodes.keys() if self.hCodes else self.occ.keys() for char in charList: l = ["'" + char + "'"] for dic in dictList: try: l.append(dic[char]) except KeyError: l.append('') tabList.append(l) return tabList def encode_text(self, wizard=True): """Encode le texte original.""" self.text = self.orgText.toPlainText().encode('utf-8') if not self.text: self.compressedText.setText(u"") self.asciiText.setText(u"") self.logLab.setText( u"<font color=#A52A2A>Rien à compresser.</font>") return self.occ = {} self.tree = () self.hCodes = {} self.aCodes = {} self.hCost = {} self.aCost = {} self.hSqueezed = [] self.aSqueezed = [] self.stringHSqueezed = '' self.stringASqueezed = '' if wizard: self.launch_wizard( EncodeWizard(self), u"<font color=#008000>Compression achevée.</font>") else: self.make_occ() self.make_tree() self.make_codes() self.make_cost() self.make_encoded_text() self.make_comp() def decode_text(self, wizard=True): """Décode le texte compressé.""" self.codeString = str( self.compressedText.toPlainText().replace(' ', '')) if not self.codeString or not self.hCodes: self.orgText.setText(u"") self.asciiText.setText(u"") if not self.codeString: self.logLab.setText( u"<font color=#A52A2A>Rien à décompresser.</font>") if not self.hCodes: self.logLab.setText( u"<font color=#A52A2A>Dictionnaire indisponible pour la décompression.</font>") return self.text = '' self.stringASqueezed = '' if wizard: self.launch_wizard( DecodeWizard(self), u"<font color=#008000>Texte décompressé.</font>") else: self.make_code_map() self.make_decoded_text() def launch_wizard(self, wizard, finishString): """Lance l'assistant d'en/décodage pour guider l'utilisateur. Cache les options inaccessibles pendant l'assistant. """ self.logLab.setText( u"<font color=#9E6A00>Opération en cours. " u"Suivre les indications.</font>") disItems = [self.orgText, self.compressedText, self.encodeBut, self.decodeBut, self.fileMenu.actions()[1], self.fileMenu.actions()[2], self.fileMenu.actions()[3]] for item in disItems: item.setEnabled(False) self.compGroup.setVisible(False) self.analysGrid.addWidget(wizard, 0, 0, 1, 1) res = wizard.exec_() if res: self.logLab.setText(finishString) else: self.logLab.setText( u"<font color=#A52A2A>Opération interrompue.</font>") for item in disItems: item.setEnabled(True) self.compGroup.setVisible(True) def update_ratio_lab(self): """Replace la valeur du label du ratio de compression.""" if not self.stringASqueezed: val = '/' else: val = (len(self.stringHSqueezed.replace(' ', '')) / float(len(self.stringASqueezed.replace(' ', '')))) self.ratioLab.setText(unicode('Taux de compression: ' + str(val))) def update_comp_table(self): """Met à jour le tableau de comparaison ASCII VS Huffman.""" self.compTabASCIIMem.setText(unicode(len(''.join(self.aSqueezed)))) self.compTabHuffMem.setText(unicode(len(''.join(self.hSqueezed)))) # entropie ? self.compTabASCIIEnt.setText('0') self.compTabHuffEnt.setText('0') self.compTabASCIIAvg.setText(unicode(8)) self.compTabHuffAvg.setText(unicode( average_code_length(self.hSqueezed))) self.compTable.resizeColumnsToContents() def update_codes_table(self, hlRow=[]): """Met à jour le tableau des codes et surligne les lignes de hlRow.""" self.codesTableModel.hlRow = hlRow self.codesTableModel.emptyTable() self.codesTableModel.fillTable(self.make_tab_rows()) self.codesTable.resizeColumnsToContents() def centerAndResize(self): """Centre et redimmensionne le widget.""" screen = QDesktopWidget().screenGeometry() self.resize(screen.width() / 1.6, screen.height() / 1.4) size = self.geometry() self.move( (screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) #===================== METHODS FOR EN/DECODE WIZARDS =====================# def make_encode_init(self): self.compressedText.setText(unicode(self.stringHSqueezed)) self.asciiText.setText(unicode(self.stringASqueezed)) self.orgText.setTextColor(QColor(Qt.darkGreen)) self.orgText.setText(unicode(self.text.decode('utf-8'))) self.update_codes_table() def make_occ(self): self.orgText.setTextColor(QColor(Qt.white)) self.orgText.setText(unicode(self.text.decode('utf-8'))) self.occ = occurences(self.text) self.update_codes_table([0, 1]) def make_tree(self): self.tree = make_trie(self.occ) self.update_codes_table() def make_codes(self): self.hCodes = make_codes(self.tree, {}) self.aCodes = make_ascii_codes(self.occ.keys(), {}) self.update_codes_table([2, 3]) def make_cost(self): self.hCost = tree_cost(self.hCodes, self.occ) self.aCost = tree_cost(self.aCodes, self.occ) self.update_codes_table([4, 5]) def make_encoded_text(self): self.hSqueezed = squeeze(self.text, self.hCodes) self.aSqueezed = squeeze(self.text, self.aCodes) self.stringHSqueezed = ' '.join(self.hSqueezed) self.stringASqueezed = ' '.join(self.aSqueezed) self.compressedText.setTextColor(QColor(Qt.darkGreen)) self.asciiText.setTextColor(QColor(Qt.darkYellow)) self.compressedText.setText(unicode(self.stringHSqueezed)) self.asciiText.setText(unicode(self.stringASqueezed)) self.update_codes_table() def make_comp(self): self.compressedText.setTextColor(QColor(Qt.white)) self.asciiText.setTextColor(QColor(Qt.white)) self.compressedText.setText(unicode(self.stringHSqueezed)) self.asciiText.setText(unicode(self.stringASqueezed)) self.update_codes_table() self.update_comp_table() self.update_ratio_lab() def make_decode_init(self): self.orgText.setText(unicode(self.text)) self.asciiText.setText(unicode(self.stringASqueezed)) self.compressedText.setTextColor(QColor(Qt.darkGreen)) self.compressedText.setText(self.compressedText.toPlainText()) def make_code_map(self): self.compressedText.setTextColor(QColor(Qt.white)) self.compressedText.setText(self.compressedText.toPlainText()) self.orgText.setText(unicode(self.text)) self.asciiText.setText(unicode(self.stringASqueezed)) self.codeMap = dict(zip(self.hCodes.values(), self.hCodes.keys())) self.update_codes_table([0, 3]) def make_decoded_text(self): self.unSqueezed = unsqueeze(self.codeString, self.codeMap) self.text = ''.join(self.unSqueezed) self.orgText.setTextColor(QColor(Qt.darkGreen)) self.orgText.setText(unicode(self.text.decode('utf-8'))) self.asciiText.setText(unicode(self.stringASqueezed)) self.update_codes_table() def make_ascii_decode(self): self.orgText.setTextColor(QColor(Qt.white)) self.orgText.setText(unicode(self.text.decode('utf-8'))) self.aCodes = make_ascii_codes(self.codeMap.values(), {}) self.aSqueezed = squeeze(self.text, self.aCodes) self.stringASqueezed = ' '.join(self.aSqueezed) self.occ = occurences(self.text) self.hCost = tree_cost(self.hCodes, self.occ) self.aCost = tree_cost(self.aCodes, self.occ) self.asciiText.setTextColor(QColor(Qt.darkGreen)) self.asciiText.setText(unicode(self.stringASqueezed)) self.update_codes_table([1, 2, 4, 5])
class EditConfigurationDialog(QWidget): def __init__(self, log, parent=None): super(EditConfigurationDialog, self).__init__(parent) layout = QVBoxLayout() self._log = log self.text_edit_widget = QTextEdit() layout.addWidget(self.text_edit_widget) buttons = QDialogButtonBox() # buttons.addButton( QDialogButtonBox.StandardButton.Cancel) buttons.addButton(QDialogButtonBox.StandardButton.Save) layout.addWidget(buttons) buttons.button(QDialogButtonBox.StandardButton.Save).clicked.connect( self._save) self.setLayout(layout) def _save(self): try: old_server_ip = configuration.get("DEFAULT", "public_ip") cfg_path = os.path.join(get_data_dir(), "server.cfg") f = open(cfg_path, "w") f.write(self.text_edit_widget.toPlainText()) f.close() self._log._log_success( "Server configuration saved in {}".format(cfg_path)) load_configuration(cfg_path, "server_config_check.cfg") self._log._log_success("Server configuration reloaded") server_ip = configuration.get("DEFAULT", "public_ip") if old_server_ip != server_ip: self._log._log_success( "Updating IP address in the downloadable delivery_slips") inject_public_ip_in_client(server_ip) except Exception as ex: self._log._log_error( "Something went wrong while saving the configuration : {}". format(ex)) self._log._log("Reloading server configuration") import threading def open_server(url): try: urlopen(url) except ConnectionResetError as ex: pass threading.Thread(target=open_server, args=['http://127.0.0.1:8079/reload']).start() def load_configuration(self): cfg_path = os.path.join(get_data_dir(), "server.cfg") # try: f = open(cfg_path, "r") t = f.read() f.close() self.text_edit_widget.setText(t)
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) #widnow setup resolution = QDesktopWidget().screenGeometry() self.screen_w = resolution.width() self.screen_h = resolution.height() self.setGeometry(0, 0, 650, 200) self.setWindowTitle('MARS change version' + mof.get_version_suffix()) self.setWindowIcon(QIcon('icons/rename.jpeg')) #center window qr = self.frameGeometry() cp = QtGui.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) #adjust size self.resize(self.screen_w / 2, self.screen_h / 10) self.Menu() self.Layout() central_widget = QtGui.QWidget() central_widget.setLayout(self.main_layout) self.setCentralWidget(central_widget) def Menu(self): #this creates an action exit, a shortcut and status tip exitAction = QAction(QIcon('icons/exit.png'), '&Exit', self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip('Exit application') exitAction.triggered.connect(self.close) openFile = QAction(QIcon('icons/open.png'), '&Open', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Open new File') openFile.triggered.connect(self.browse) runAction = QAction(QIcon('icons/run.png'), '&Run', self) runAction.setShortcut('Ctrl+R') runAction.setStatusTip('Run Mars') runAction.triggered.connect(self.run_event) def Layout(self): #LAYOUT self.directory_prompt = QLabel(self) self.directory_prompt.setText("Directory Selected:") self.directory_prompt.move(25, 50) self.directory_prompt.resize(150, 30) self.directory_prompt.setVisible(False) self.browse_btn = QPushButton("Browse", self) self.browse_btn.move(130, 50) self.browse_btn.resize(50, 30) self.browse_btn.setStatusTip(" Browse Folder") # self.browse_btn.setStyleSheet("background-color: rgb(186, 186, 186); border-radius: 15px;border-style: solid;border-width: 2px;border-color: black;"); self.browse_btn.clicked.connect(self.browse) self.dir_shower = QLabel(self) self.dir_shower.setText("") self.dir_shower.setVisible(False) self.label_version = QLabel(self) self.label_version.setText("Version to rename") self.label_version.setVisible(False) self.version = QTextEdit() self.version.setStatusTip("Version to rename example: 1_6") self.version.setFixedHeight(30) self.version.setFixedWidth(40) self.version.setVisible(False) self.run_mars = QPushButton("RENAME", self) self.run_mars.setVisible(False) self.run_mars.move(50, 200) self.run_mars.resize(self.screen_w / 2 - 150, 50) self.run_mars.setStatusTip('') self.run_mars.setStyleSheet( "background-color: rgb(142, 229, 171); border-radius: 15px;") self.run_mars.clicked.connect(self.run_event) self.menu_layout = QtGui.QHBoxLayout() self.menu_layout.addWidget(self.browse_btn) self.menu_layout.addWidget(self.directory_prompt) self.menu_layout.addWidget(self.dir_shower) self.menu_layout.addStretch() self.version_layout = QtGui.QHBoxLayout() self.version_layout.addWidget(self.label_version) self.version_layout.addWidget(self.version) self.version_layout.addStretch() self.run_layout = QtGui.QHBoxLayout() self.run_layout.addWidget(self.run_mars) self.main_layout = QtGui.QVBoxLayout() self.main_layout.addLayout(self.menu_layout) self.main_layout.addLayout(self.version_layout) self.main_layout.addLayout(self.run_layout) self.main_layout.addStretch() def browse(self): # sender = self.sender() dialog = QtGui.QFileDialog() dialog.setFileMode(QtGui.QFileDialog.Directory) dialog.setOption(QtGui.QFileDialog.ShowDirsOnly) self.dirname = dialog.getExistingDirectory(self, 'Choose Directory', os.path.curdir) if os.path.exists(self.dirname) and os.path.isdir(self.dirname): self.dir_shower.setText(self.dirname) self.dir_shower.setVisible(True) self.directory_prompt.setVisible(True) self.version.setVisible(True) self.label_version.setVisible(True) self.run_mars.setVisible(True) return else: QMessageBox.information(self, " Wrong file selected", "Select a folder containing .seq files!") def run_event(self): self.genericThread = GenericThread(self.dirname, self.version.toPlainText()) self.genericThread.start()
class MainWindow(QMainWindow): windows = [] def __init__(self): super(MainWindow, self).__init__() # Store ourself. self.windows.append(self) # State! self.current_file = None # Editor! self.editor = QTextEdit() self.setCentralWidget(self.editor) # Style the editor #style.apply_stylesheet(self.editor, 'editor.qss') # Menus and Stuff! self.init_actions() self.init_menus() self.init_toolbars() self.init_statusbar() # Settings! self.init_settings() # Icons! self.reload_icons() #style.style_reloaded.connect(self.reload_icons) # Fancy! #style.enable_aero(self) self.update_title() # Now, for some plugins. # plugins.run_signal('new_window', self) ##### Action Icons! ####################################################### def reload_icons(self): #self.setWindowIcon(style.icon('application')) pass # a = self.actions # for key in a.keys(): # a[key].setIcon(style.icon(key.lower())) ##### Actions! ############################################################ def init_actions(self): self.actions = a = {} ##### File Menu ####################################################### a['document-new'] = QAction("&New", self, shortcut=QKeySequence.New, statusTip="Create a new file.", triggered=self.action_new) a['document-open'] = QAction("&Open", self, shortcut=QKeySequence.Open, statusTip="Open an existing file.", triggered=self.action_open) a['document-save'] = QAction("&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk.", triggered=self.action_save) a['application-exit'] = QAction("E&xit", self, statusTip="Exit the application.", triggered=self.close) ##### Edit Menu ####################################################### a['edit-cut'] = QAction("Cu&t", self, shortcut=QKeySequence.Cut, triggered=self.editor.cut) a['edit-copy'] = QAction("&Copy", self, shortcut=QKeySequence.Copy, triggered=self.editor.copy) a['edit-paste'] = QAction("&Paste", self, shortcut=QKeySequence.Paste, triggered=self.editor.paste) a['edit-cut'].setEnabled(False) a['edit-copy'].setEnabled(False) self.editor.copyAvailable.connect(a['edit-cut'].setEnabled) self.editor.copyAvailable.connect(a['edit-copy'].setEnabled) ##### Tool Menu ####################################################### # This is the fun part. a['addon-manager'] = QAction("&Add-ons", self, shortcut="Ctrl+Shift+A", statusTip="Display the Add-ons manager.", triggered=addons.show) # a['view-refresh'] = QAction("&Reload Style", self, # shortcut="Ctrl+Shift+R", # statusTip="Reload the style.", # triggered=style.reload) ##### Menus! ############################################################## def init_menus(self): self.menuBar().clear() a = self.actions file = self.menuBar().addMenu("&File") file.addAction(a['document-new']) file.addAction(a['document-open']) file.addAction(a['document-save']) file.addSeparator() file.addAction(a['application-exit']) edit = self.menuBar().addMenu("&Edit") edit.addAction(a['edit-cut']) edit.addAction(a['edit-copy']) edit.addAction(a['edit-paste']) tools = self.menuBar().addMenu("&Tools") tools.addAction(a['addon-manager']) #tools.addAction(a['view-refresh']) ##### Explosions! ######################################################### ##### Toolbars! ########################################################### def init_toolbars(self): a = self.actions file = self.addToolBar("File") file.setObjectName('filebar') file.addAction(a['document-new']) file.addAction(a['document-open']) file.addAction(a['document-save']) edit = self.addToolBar("Edit") edit.setObjectName('editbar') edit.addAction(a['edit-cut']) edit.addAction(a['edit-copy']) edit.addAction(a['edit-paste']) tools = self.addToolBar("Tools") tools.setObjectName('toolsbar') tools.addAction(a['addon-manager']) #tools.addAction(a['view-refresh']) ##### Statusbars! ######################################################### def init_statusbar(self): self.statusBar().showMessage("Ready.") ##### Settings! ########################################################### def init_settings(self): self.restoreGeometry(profile.get("geometry")) self.restoreState(profile.get("state")) def save_settings(self): profile.set("geometry", self.saveGeometry()) profile.set("state", self.saveState()) ##### Actual Actions! ##################################################### def update_title(self): if self.current_file: title = os.path.basename(self.current_file) else: title = "Untitled" self.setWindowTitle("%s - %s" % (title, QApplication.instance().applicationName())) def action_new(self): if self.try_save(): self.editor.clear() self.current_file = None self.update_title() def action_open(self): if self.try_save(): fn = QFileDialog.getOpenFileName(self)[0] if not fn: return self.do_open(fn) def do_open(self, fn): with open(fn, 'r') as f: content = f.read() self.editor.setPlainText(content) self.current_file = fn self.update_title() def action_save(self): if not self.editor.document().isModified(): return if not self.current_file: self.current_file = QFileDialog.getSaveFileName(self)[0] self.update_title() if not self.current_file: return with open(self.current_file, 'w') as f: f.write(self.editor.toPlainText()) self.editor.document().setModified(False) ##### Adventure! ########################################################## def try_save(self): if self.editor.document().isModified(): ret = QMessageBox.warning( self, "Blah Blah Blah", "That's an awfully nice modified document you've got there" ". It'd be a shame if anything... happened to it. Catch " "my drift?", QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) if ret == QMessageBox.Save: self.action_save() elif ret == QMessageBox.Cancel: return False return True def showRaise(self): """ Show and raise the window. """ # self.show() # self.raise_() # self.setFocus() self.activateWindow() if self.isMinimized(): self.showNormal() def closeEvent(self, event): if self.try_save(): self.save_settings() if self in self.windows: self.windows.remove(self) # plugins.run_signal('close_window', self) event.accept() else: event.ignore()
class ToolBox(QVBoxLayout): sig = QtCore.Signal(object) listThread = None groupBoxThreadInfo = None threadvbox = None mode = None def __init__(self, mode, parentQWidget=None): QVBoxLayout.__init__(self) self.sig.connect(self.addThreadList) self.mode = mode self.sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) self.groupBoxSearch = QGroupBox() self.groupBoxSearch.setStyleSheet( "QGroupBox {border: 1px solid gray; border-radius: 4px; };") vboxSearch = QVBoxLayout() self.searchTitle = QLabel("Search Messages") vboxSearch.addWidget(self.searchTitle) self.searchHLayout = QHBoxLayout() self.editTextSearch = QTextEdit('') self.editTextSearch.setFixedSize(200, 30) self.buttonSearch = QPushButton('Search') self.buttonSearch.setFixedSize(100, 30) self.buttonSearch.clicked.connect(self.searchMsg) vboxSearch.addWidget(self.editTextSearch) self.searchHLayout.addWidget(self.buttonSearch) self.searchCursor = QLabel() self.searchHLayout.addWidget(self.searchCursor) vboxSearch.addLayout(self.searchHLayout) self.browseHLayout = QHBoxLayout() self.buttonLookUp = QPushButton('\u21e7') #Arrow up self.buttonLookUp.setFixedWidth(100) self.buttonLookUp.clicked.connect(self.moveToPrev) self.buttonLookDown = QPushButton('\u21e9') #Arrow down self.buttonLookDown.setFixedWidth(100) self.buttonLookDown.clicked.connect(self.moveToNext) self.browseHLayout.addWidget(self.buttonLookUp) self.browseHLayout.addWidget(self.buttonLookDown) vboxSearch.addLayout(self.browseHLayout) self.groupBoxSearch.setLayout(vboxSearch) self.addWidget(self.groupBoxSearch) self.groupBoxSearch.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)) self.buttonHiddenLifelines = QPushButton('Show hidden life-lines') self.buttonHiddenLifelines.setFixedWidth(200) self.buttonHiddenLifelines.clicked.connect(self.showHiddenLifelines) self.addWidget(self.buttonHiddenLifelines) self.buttonHiddenMessages = QPushButton('Show hidden Messages') self.buttonHiddenMessages.setFixedWidth(200) self.buttonHiddenMessages.clicked.connect(self.showHiddenMessages) self.addWidget(self.buttonHiddenMessages) if const.mode_interactive == mode: self.buttonCapture = QPushButton('Capture') self.buttonCapture.setFixedWidth(200) self.buttonCapture.clicked.connect(self.notifyCapture) self.addWidget(self.buttonCapture) self.msgRcv = [] self.msgInfo = QLabel("Message Info.") self.groupBoxMessageInfo = QGroupBox() self.groupBoxMessageInfo.setStyleSheet( "QGroupBox {border: 1px solid gray; border-radius: 9px; margin-top: 0.5em} QGroupBox::title {subcontrol-origin: margin; left: 10px; padding: 0 3px 0 3px;" ) vbox = QVBoxLayout() vbox.addWidget(self.msgInfo) self.tableTime = QtGui.QTableWidget(3, 2) self.tableTime.setHorizontalHeaderLabels(['-', 'time']) self.tableTime.setColumnWidth(0, 80) self.tableTime.setColumnWidth(1, 150) vwidth = self.tableTime.verticalHeader().length() hwidth = self.tableTime.horizontalHeader().height() fwidth = self.tableTime.frameWidth() * 2 self.tableTime.setFixedHeight(vwidth + hwidth + fwidth) self.tableTime.horizontalHeader().setStretchLastSection(True) self.tableTime.setItem(0, 0, QTableWidgetItem('begin')) self.tableTime.setItem(0, 1, QTableWidgetItem(' - ')) self.tableTime.setItem(1, 0, QTableWidgetItem('end')) self.tableTime.setItem(1, 1, QTableWidgetItem(' - ')) self.tableTime.setItem(2, 0, QTableWidgetItem('duration')) self.tableTime.setItem(2, 1, QTableWidgetItem(' - ')) vbox.addWidget(self.tableTime) self.titleArg = QLabel('Argument List') vbox.addWidget(self.titleArg) max_arg_num = 10 self.tableArgs = QtGui.QTableWidget(max_arg_num, 2) self.tableArgs.setHorizontalHeaderLabels(['type', 'value']) for idx in range(0, max_arg_num): self.tableArgs.setItem(idx, 0, QTableWidgetItem()) self.tableArgs.setItem(idx, 1, QTableWidgetItem()) self.tableArgs.horizontalHeader().setStretchLastSection(True) vbox.addWidget(self.tableArgs) self.titleArg = QLabel('Return Value List') vbox.addWidget(self.titleArg) max_ret_num = 4 self.tableRet = QtGui.QTableWidget(max_ret_num, 2) self.tableRet.setHorizontalHeaderLabels(['type', 'value']) for idx in range(0, max_ret_num): self.tableRet.setItem(idx, 0, QTableWidgetItem()) self.tableRet.setItem(idx, 1, QTableWidgetItem()) self.tableRet.horizontalHeader().setStretchLastSection(True) vwidth = self.tableRet.verticalHeader().length() hwidth = self.tableRet.horizontalHeader().height() fwidth = self.tableRet.frameWidth() * 2 self.tableRet.setFixedHeight(vwidth + hwidth + fwidth) vbox.addWidget(self.tableRet) self.buttonSrcView = QPushButton('view code') self.buttonSrcView.setFixedWidth(200) self.buttonSrcView.clicked.connect(self.openSourceViewer) self.buttonHide = QPushButton('Hide') self.buttonHide.setFixedWidth(200) self.buttonHide.clicked.connect(self.notifyHide) self.buttonHideAllMsg = QPushButton('Hide All') self.buttonHideAllMsg.setFixedWidth(200) self.buttonHideAllMsg.clicked.connect(self.hideAllMsgNamedAsSelected) self.groupBoxMessageInfo.setLayout(vbox) self.checkHideCircular = QCheckBox('Hide Circular Messages') self.checkHideCircular.setCheckState(QtCore.Qt.Unchecked) self.checkHideCircular.stateChanged.connect( self.changeHideCircularMessage) self.addWidget(self.checkHideCircular) self.addWidget(self.groupBoxMessageInfo) self.groupBoxMessageInfo.setSizePolicy(self.sizePolicy) def reset(self): for idx in reversed(range(0, self.listThread.count())): self.listThread.takeItem(idx) def setMsgInfoMessage(self, msg): self.strMessage = msg def changeHideCircularMessage(self, state): if state == QtCore.Qt.Unchecked: self.diagramView.hideCircularChanged(False) elif state == QtCore.Qt.Checked: self.diagramView.hideCircularChanged(True) def setMsgInfoModule(self, module): self.strModule = module def updateSearchStatus(self, curr, number): self.searchCursor.setText("%d/%d" % (curr, number)) def connectSourceViewer(self, viewer): self.srcViewer = viewer def openSourceViewer(self): self.srcViewer.openViewer(self.strModule, self.strMessage) def setMessageInfoTime(self, begin, end, duration): self.tableTime.item(0, 1).setText(begin) self.tableTime.item(1, 1).setText(end) self.tableTime.item(2, 1).setText(duration + ' msec') def setMessageInfoArg(self, listParam, listArg): if listArg: for idx, text in enumerate(listArg): self.tableArgs.item(idx, 1).setText(text) for idx, text in enumerate(listParam): self.tableArgs.item(idx, 0).setText(text) else: for idx in range(0, self.tableArgs.rowCount()): self.tableArgs.item(idx, 1).setText('') self.tableArgs.item(idx, 0).setText('') def setMessageInfoRet(self, listRet): if listRet: for idx, text in enumerate(listRet): self.tableRet.item(idx, 1).setText(text) else: for idx in range(0, self.tableRet.rowCount()): self.tableRet.item(idx, 1).setText('') self.tableRet.item(idx, 0).setText('') def notifyInteractiveStateChanged(self, state): if const.mode_interactive != self.mode: return if const.STATE_INTERACTIVE_CAPTURING == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Stop Capture') if const.STATE_INTERACTIVE_PROCESSING == state: self.buttonCapture.setEnabled(False) if const.STATE_INTERACTIVE_IDLE == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Capture') if const.STATE_INTERACTIVE_RESET == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Capture') elif const.STATE_INTERACTIVE_ACTIVE == state: self.buttonCapture.setEnabled(True) self.buttonCapture.setText('Capture') def setMessageInfo(self, info): self.msgInfo.setText(info) def setAvailable(self, threads): self.sig.emit(threads) def toggleThreadDisplay(self, item): print(self.listThread.currentRow()) #if item.isSelected(): # print(item.text() + " is selected") #else: # print(item.text() + " is not selected") self.diagramView.showThread(self.listThread.currentRow(), item.isSelected()) def hideAllMsgNamedAsSelected(self): self.diagramView.hideAllMessageSelected() def addThreadList(self, threads): if not self.groupBoxThreadInfo: self.groupBoxThreadInfo = QGroupBox() self.threadInfo = QLabel("Thread Info.") self.groupBoxThreadInfo.setStyleSheet( "QGroupBox {border: 1px solid gray; border-radius: 9px; margin-top: 0.5em} QGroupBox::title {subcontrol-origin: margin; left: 10px; padding: 0 3px 0 3px;" ) if not self.threadvbox: self.threadvbox = QVBoxLayout() if not self.listThread: self.listThread = QListWidget() self.listThread.setFixedWidth(200) self.listThread.setSelectionMode( QtGui.QAbstractItemView.MultiSelection) QtCore.QObject.connect(self.listThread, QtCore.SIGNAL("itemClicked(QListWidgetItem *)"), self.toggleThreadDisplay) self.threadvbox.addWidget(self.threadInfo) self.threadvbox.addWidget(self.listThread) self.groupBoxThreadInfo.setLayout(self.threadvbox) self.addWidget(self.groupBoxThreadInfo) self.groupBoxThreadInfo.setSizePolicy(self.sizePolicy) for id in threads: item = QtGui.QListWidgetItem(id) self.listThread.addItem(item) def connectController(self, controller): self.controller = controller self.connect(controller, QtCore.SIGNAL('setAvailable()'), self.setAvailable) def connectDiagramView(self, view): self.diagramView = view def disconnectMsgRcv(self, receiver): print("Implement this method !!! disconnectMsgRcv") def connectMsgRcv(self, receiver): self.msgRcv.append(receiver) def notifyHide(self): for rcv in self.msgRcv: rcv.activateHide(True) def showHiddenLifelines(self): response, selected_items = HiddenDialog.HiddenDialog.getSelectedItems( self.diagramView.getHiddenLifeLines()) if response: self.diagramView.showLifelines(selected_items) def showHiddenMessages(self): response, selected_items = HiddenMessageDialog.HiddenMessageDialog.getSelectedItems( self.diagramView.getHiddenMessages(), self.diagramView.getHiddenLifeLines()) if response: if selected_items[3] in self.diagramView.getHiddenLifeLines(): confirmation = ShowLifeLineDialog.ShowLifeLineDialog.confirmToShowLifeLine( selected_items[3]) if confirmation: self.diagramView.showLifelines([selected_items[3]]) self.diagramView.showMessages(selected_items) else: self.diagramView.showMessages(selected_items) def notifyCapture(self): for rcv in self.msgRcv: rcv.activateCapture(True) def moveToPrev(self): for rcv in self.msgRcv: rcv.moveToPrev() def moveToNext(self): for rcv in self.msgRcv: rcv.moveToNext() def searchMsg(self): str = self.editTextSearch.toPlainText() for rcv in self.msgRcv: rcv.searchMessage(str)
class MainWindow(QMainWindow): windows = [] def __init__(self): super(MainWindow, self).__init__() # Store ourself. self.windows.append(self) # State! self.current_file = None # Editor! self.editor = QTextEdit() self.setCentralWidget(self.editor) # Style the editor style.apply_stylesheet(self.editor, 'editor.qss') # Menus and Stuff! self.init_actions() self.init_menus() self.init_toolbars() self.init_statusbar() # Settings! self.init_settings() # Icons! self.reload_icons() style.style_reloaded.connect(self.reload_icons) # Fancy! style.enable_aero(self) self.update_title() # Now, for some plugins. plugins.run_signal('new_window', self) ##### Action Icons! ####################################################### def reload_icons(self): self.setWindowIcon(style.icon('application')) a = self.actions for key in a.keys(): a[key].setIcon(style.icon(key.lower())) ##### Actions! ############################################################ def init_actions(self): self.actions = a = {} ##### File Menu ####################################################### a['document-new'] = QAction("&New", self, shortcut=QKeySequence.New, statusTip="Create a new file.", triggered=self.action_new) a['document-open'] = QAction("&Open", self, shortcut=QKeySequence.Open, statusTip="Open an existing file.", triggered=self.action_open) a['document-save'] = QAction("&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk.", triggered=self.action_save) a['application-exit'] = QAction("E&xit", self, statusTip="Exit the application.", triggered=self.close) ##### Edit Menu ####################################################### a['edit-cut'] = QAction("Cu&t", self, shortcut=QKeySequence.Cut, triggered=self.editor.cut) a['edit-copy'] = QAction("&Copy", self, shortcut=QKeySequence.Copy, triggered=self.editor.copy) a['edit-paste'] = QAction("&Paste", self, shortcut=QKeySequence.Paste, triggered=self.editor.paste) a['edit-cut'].setEnabled(False) a['edit-copy'].setEnabled(False) self.editor.copyAvailable.connect(a['edit-cut'].setEnabled) self.editor.copyAvailable.connect(a['edit-copy'].setEnabled) ##### Tool Menu ####################################################### # This is the fun part. a['addon-manager'] = QAction("&Add-ons", self, shortcut="Ctrl+Shift+A", statusTip="Display the Add-ons manager.", triggered=addons.show) a['view-refresh'] = QAction("&Reload Style", self, shortcut="Ctrl+Shift+R", statusTip="Reload the style.", triggered=style.reload) ##### Menus! ############################################################## def init_menus(self): self.menuBar().clear() a = self.actions file = self.menuBar().addMenu("&File") file.addAction(a['document-new']) file.addAction(a['document-open']) file.addAction(a['document-save']) file.addSeparator() file.addAction(a['application-exit']) edit = self.menuBar().addMenu("&Edit") edit.addAction(a['edit-cut']) edit.addAction(a['edit-copy']) edit.addAction(a['edit-paste']) tools = self.menuBar().addMenu("&Tools") tools.addAction(a['addon-manager']) tools.addAction(a['view-refresh']) ##### Explosions! ######################################################### ##### Toolbars! ########################################################### def init_toolbars(self): a = self.actions file = self.addToolBar("File") file.setObjectName('filebar') file.addAction(a['document-new']) file.addAction(a['document-open']) file.addAction(a['document-save']) edit = self.addToolBar("Edit") edit.setObjectName('editbar') edit.addAction(a['edit-cut']) edit.addAction(a['edit-copy']) edit.addAction(a['edit-paste']) tools = self.addToolBar("Tools") tools.setObjectName('toolsbar') tools.addAction(a['addon-manager']) tools.addAction(a['view-refresh']) ##### Statusbars! ######################################################### def init_statusbar(self): self.statusBar().showMessage("Ready.") ##### Settings! ########################################################### def init_settings(self): self.restoreGeometry(profile.get("geometry")) self.restoreState(profile.get("state")) def save_settings(self): profile.set("geometry", self.saveGeometry()) profile.set("state", self.saveState()) ##### Actual Actions! ##################################################### def update_title(self): if self.current_file: title = os.path.basename(self.current_file) else: title = "Untitled" self.setWindowTitle("%s - %s" % (title, QApplication.instance().applicationName())) def action_new(self): if self.try_save(): self.editor.clear() self.current_file = None self.update_title() def action_open(self): if self.try_save(): fn = QFileDialog.getOpenFileName(self)[0] if not fn: return self.do_open(fn) def do_open(self, fn): with open(fn, 'r') as f: content = f.read() self.editor.setPlainText(content) self.current_file = fn self.update_title() def action_save(self): if not self.editor.document().isModified(): return if not self.current_file: self.current_file = QFileDialog.getSaveFileName(self)[0] self.update_title() if not self.current_file: return with open(self.current_file, 'w') as f: f.write(self.editor.toPlainText()) self.editor.document().setModified(False) ##### Adventure! ########################################################## def try_save(self): if self.editor.document().isModified(): ret = QMessageBox.warning(self, "Blah Blah Blah", "That's an awfully nice modified document you've got there" ". It'd be a shame if anything... happened to it. Catch " "my drift?", QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel ) if ret == QMessageBox.Save: self.action_save() elif ret == QMessageBox.Cancel: return False return True def closeEvent(self, event): if self.try_save(): self.save_settings() if self in self.windows: self.windows.remove(self) plugins.run_signal('close_window', self) event.accept() else: event.ignore()
class PrintPreorderDialog(QDialog): def __init__(self, parent): super(PrintPreorderDialog, self).__init__(parent) title = _("Print preorder") self.setWindowTitle(title) top_layout = QVBoxLayout() self.title_widget = TitleWidget(title, self) top_layout.addWidget(self.title_widget) info = QLabel( _("Here you can give a small message that will be printed togetehr with the preorder." ), self) info.setWordWrap(True) top_layout.addWidget(info) top_layout.addWidget(QLabel(_("Header text"))) self.message_text_area = QTextEdit() top_layout.addWidget(self.message_text_area) top_layout.addWidget(QLabel(_("Footer text"))) self.message_text_area_footer = QTextEdit() top_layout.addWidget(self.message_text_area_footer) self.buttons = QDialogButtonBox() self.buttons.addButton(QDialogButtonBox.StandardButton.Cancel) self.buttons.addButton(QDialogButtonBox.Ok) top_layout.addWidget(self.buttons) self.setLayout(top_layout) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) def set_preorder(self, preorder_id): preorder = dao.order_dao.find_by_id_frozen(preorder_id) if preorder.preorder_print_note: self.message_text_area.setText(preorder.preorder_print_note) else: self.message_text_area.setText( _("Sir,\nPlease find your preorder below as discussed earlier. Please send us a signed copy to complete the order.\nBest regards" )) if preorder.preorder_print_note_footer: self.message_text_area_footer.setText( preorder.preorder_print_note_footer) else: self.message_text_area_footer.setText( _("Best regards,\n\nthe company team.")) def get_print_notes(self): return self.message_text_area.toPlainText().strip( ), self.message_text_area_footer.toPlainText().strip() @Slot() def accept(self): super(PrintPreorderDialog, self).accept() @Slot() def reject(self): super(PrintPreorderDialog, self).reject()
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.initGUI() def initGUI(self): self.setWindowTitle("A Simple Text Editor") self.setWindowIcon(QIcon('appicon.png')) self.setGeometry(100, 100, 800, 600) self.center() # Text Editor self.textEdit = QTextEdit() self.setCentralWidget(self.textEdit) self.fileName = None self.filters = "Text files (*.txt)" # Setup and Show self.setupComponents() self.show() def center(self): """ Function to center the application """ qRect = self.frameGeometry() centerPoint = QDesktopWidget().availableGeometry().center() qRect.moveCenter(centerPoint) self.move(qRect.topLeft()) #=================================================================# # Create Central Widget Component to use QTextEdit #=================================================================# def setupComponents(self): """ Setting the central widget """ # Progress Bar #self.progressBar = QProgressBar() #self.progressBar.setMinimum(0) #self.progressBar.setMaximum(100) # Status Label #self.statusLabel = QLabel('Status', self) # Status Bar self.myStatusBar = QStatusBar() #self.myStatusBar.addWidget(self.statusLabel, 1) #self.myStatusBar.addWidget(self.progressBar, 5) self.setStatusBar(self.myStatusBar) self.myStatusBar.showMessage('Ready', 1000) self.createActions() self.createMenus() self.createToolBar() # File Menu self.fileMenu.addAction(self.newAction) self.fileMenu.addAction(self.openAction) self.fileMenu.addAction(self.saveAction) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAction) # Edit Menu self.editMenu.addAction(self.cutAction) self.editMenu.addAction(self.copyAction) self.editMenu.addAction(self.pasteAction) self.editMenu.addSeparator() self.editMenu.addAction(self.undoAction) self.editMenu.addAction(self.redoAction) self.editMenu.addSeparator() self.editMenu.addAction(self.selectAllAction) # Format Menu self.formatMenu.addAction(self.fontAction) # Help Menu self.helpMenu.addAction(self.aboutAction) self.helpMenu.addSeparator() self.helpMenu.addAction(self.aboutQtAction) # Tool Bar self.mainToolBar.addAction(self.newAction) self.mainToolBar.addAction(self.openAction) self.mainToolBar.addAction(self.saveAction) self.mainToolBar.addSeparator() self.mainToolBar.addAction(self.cutAction) self.mainToolBar.addAction(self.copyAction) self.mainToolBar.addAction(self.pasteAction) self.mainToolBar.addSeparator() self.mainToolBar.addAction(self.undoAction) self.mainToolBar.addAction(self.redoAction) # NOT-NEEDED : For progress bar def showProgress(self, progress): """ Function to show progress """ self.progressBar.setValue(progress) if progress == 100: self.statusLabel.setText('Ready') return #=================================================================# # Helper Functions #=================================================================# def msgApp(self, title, message): """ Fuction to show dialog box with message """ userInfo = QMessageBox.question(self, title, message, QMessageBox.Yes | QMessageBox.No) if userInfo == QMessageBox.Yes: return "Y" if userInfo == QMessageBox.No: return "N" self.close() #=================================================================# # Slots: called when the menu actions are triggered #=================================================================# def newFile(self): response = self.msgApp("Confirmation", "Do you want to save the current file?") if response == "Y": self.saveFile() self.textEdit.setText('') self.fileName = None def openFile(self): response = self.msgApp("Confirmation", "Save the current file before open a new one?") if response == "Y": self.saveFile() (self.fileName, self.filterName) = QFileDialog.getOpenFileName(self) self.textEdit.setText(open(self.fileName).read()) def saveFile(self): if self.fileName == None or self.fileName == '': (self.fileName, self.filterName) = \ QFileDialog.getSaveFileName(self, filter=self.filters) if (self.fileName != ''): file = open(self.fileName, 'w') file.write(self.textEdit.toPlainText()) self.statusBar().showMessage("File saved", 2000) def exitFile(self): response = self.msgApp("Confirmation", "This will quit the application, continue?") if response == "Y": myApp.quit() else: pass def fontChange(self): (font, ok) = QFontDialog.getFont(QFont("Helvetica [Cronyx]", 10), self) if ok: self.textEdit.setCurrentFont(font) def aboutHelp(self): QMessageBox.about(self, "About Simple Text Editor", "This example demonstrates the use of " + \ "a Menu Bar") def aboutQt(self): QMessageBox.aboutQt(self, title="Qt Version") #=================================================================# # Actions: send signals to slots #=================================================================# def createActions(self): """ Function to create actions for menus """ # Parameters are as follows # 1. Icon to be displayed on the left # 2. The name, '&' means the the letter following # will the be underlined (press 'Alt' to see) # 3. Implies the parent, which is the main window # 4. Shortcut key # 5. status tip in bottom status bar # 6. slot to be called self.newAction = QAction(QIcon('new.png'), '&New File', self, shortcut=QKeySequence.New, statusTip="Create a New File", triggered=self.newFile) self.openAction = QAction(QIcon('open.png'), '&Open File', self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.openFile) self.saveAction = QAction(QIcon('save.png'), '&Save File', self, shortcut=QKeySequence.Save, statusTip="Save the current file", triggered=self.saveFile) self.cutAction = QAction( QIcon('cut.png'), '&Cut', self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection to clipboard", triggered=self.textEdit.cut) self.copyAction = QAction(QIcon('copy.png'), '&Copy', self, shortcut="Ctrl+C", statusTip="Copy", triggered=self.textEdit.copy) self.pasteAction = QAction(QIcon('paste.png'), '&Paste', self, shortcut="Ctrl+V", statusTip="Paste", triggered=self.textEdit.paste) self.selectAllAction = QAction(QIcon('selectAll.png'), '&Select All', self, statusTip="Select All", triggered=self.textEdit.selectAll) self.redoAction = QAction(QIcon('redo.png'), '&Redo', self, shortcut=QKeySequence.Redo, statusTip="Redo previous action", triggered=self.textEdit.redo) self.undoAction = QAction(QIcon('undo.png'), '&Undo', self, shortcut=QKeySequence.Undo, statusTip="Undo previous action", triggered=self.textEdit.undo) self.fontAction = QAction('F&ont', self, statusTip="Modify font properties", triggered=self.fontChange) self.aboutAction = QAction(QIcon('about.png'), '&About', self, statusTip="Displays info about text editor", triggered=self.aboutHelp) self.aboutQtAction = QAction( 'About &Qt', self, statusTip="Show the Qt library's About box", triggered=self.aboutQt) self.exitAction = QAction(QIcon('exit.png'), '&Exit', self, shortcut="Ctrl+Q", statusTip="Exit the program", triggered=self.exitFile) #=================================================================# # Actual menu bar item creation #=================================================================# def createMenus(self): """ Function to create actual menu bar """ self.fileMenu = self.menuBar().addMenu("&File") self.editMenu = self.menuBar().addMenu("&Edit") self.formatMenu = self.menuBar().addMenu("&Format") self.helpMenu = self.menuBar().addMenu("&Help") #=================================================================# # Tool Bar #=================================================================# def createToolBar(self): """ Function to create tool bar """ self.mainToolBar = self.addToolBar('Main Tool Bar')
class ConsoleWidget(QMainWindow): def __init__(self): super(ConsoleWidget, self).__init__() self.setWindowTitle('1c query') self._connection = None self._home = os.path.expanduser('~/%s' % QApplication.applicationName()) if not os.path.isdir(self._home): os.mkdir(self._home) self.queryToolBar = self.addToolBar('Query') self.queryAction = self.queryToolBar.addAction('Run', self.executeQuery) self.queryAction.setDisabled(True) uri_history = list() path = os.path.join(self._home, 'uri_history.txt') if os.path.isfile(path): uri_history = open(path, 'r').read().split('\n') self.connectionToolBar = self.addToolBar('Connection') self.connectionUriCombo = QComboBox(self) self.connectionUriCombo.setEditable(True) if not uri_history: self.connectionUriCombo.addItem('File="";usr="";pwd="";') self.connectionUriCombo.addItem('Srvr="{host}";Ref="{ref}";Usr="******";Pwd="{password}";') else: self.connectionUriCombo.addItems(uri_history) self.connectionUriCombo.setCurrentIndex(len(uri_history) - 1) self.connectionUriCombo.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Maximum) self.connectionToolBar.addWidget(self.connectionUriCombo) self.onesVersionCombo = QComboBox(self) self.onesVersionCombo.addItems(['8.3', '8.2', '8.1', '8.0']) self.onesVersionCombo.setCurrentIndex(0) self.connectionToolBar.addWidget(self.onesVersionCombo) self.connectAction = self.connectionToolBar.addAction('Connect', self.connectOneS) self.disconnectAction = self.connectionToolBar.addAction('Disconnect', self.disconnectOneS) self.disconnectAction.setDisabled(True) self.logEdit = QPlainTextEdit(self) self.logDock = QDockWidget('Log', self) self.logDock.setWidget(self.logEdit) self.addDockWidget(Qt.BottomDockWidgetArea, self.logDock, Qt.Horizontal) self.splitter = QSplitter(Qt.Vertical, self) self.setCentralWidget(self.splitter) self.sqlEdit = QTextEdit(self) self.sqlEdit.setLineWrapMode(QTextEdit.NoWrap) path = os.path.join(self._home, 'last-sql.txt') if os.path.isfile(path): sql = open(path, 'r').read() self.sqlEdit.setText(sql) self.model = QStandardItemModel(self) self.tableView = QTableView(self) self.tableView.setModel(self.model) self.splitter.addWidget(self.sqlEdit) self.splitter.addWidget(self.tableView) self.splitter.setStretchFactor(0, 3) self.splitter.setStretchFactor(1, 2) def query(self, sql): if not self._connection: self.logEdit.appendPlainText('No connection') return None try: query = self._connection.NewObject('Query', sql) result = query.Execute() except Exception as e: self.logEdit.appendPlainText(str(e)) return None return result def refresh(self, result): self.model.clear() columns = list() result_columns = result.Columns for index in range(result_columns.Count()): name = result_columns.Get(index).Name columns.append(name) self.model.setColumnCount(len(columns)) for section, name in enumerate(columns): self.model.setHeaderData(section, Qt.Horizontal, name) select = result.Choose() self.logEdit.appendPlainText('Selected %d records' % select.Count()) while select.Next(): items = list() for index in range(len(columns)): value = select.Get(index) item = QStandardItem('') if isinstance(value, bool): item.setText(value and 'Yes' or 'No') elif isinstance(value, (int, str)): item.setText(str(value)) elif isinstance(value, datetime.datetime): item.setText(value.strftime('%Y.%m.%d %H:%M:%S')) else: item.setText(str(value)) items.append(item) self.model.appendRow(items) @Slot() def executeQuery(self): sql = self.sqlEdit.toPlainText() result = self.query(sql) if result: path = os.path.join(self._home, 'last-sql.txt') open(path, 'w').write(sql) self.refresh(result) @Slot() def connectOneS(self): uri = self.connectionUriCombo.currentText().strip() if not uri: self.logEdit.appendPlainText('Need a connection string') return version = self.onesVersionCombo.currentText() comName = "V%s.COMConnector" % str(version).replace('.', '') pythoncom.CoInitialize() try: obj = win32com.client.Dispatch(comName) self._connection = obj.Connect(uri) except Exception as e: self.logEdit.appendPlainText(str(e)) return self.connectAction.setDisabled(True) self.disconnectAction.setEnabled(True) self.queryAction.setEnabled(True) uri_history = list() for i in range(self.connectionUriCombo.count()): uri_history.append(self.connectionUriCombo.itemText(i)) if uri not in uri_history: self.connectionUriCombo.clearEditText() self.connectionUriCombo.addItem(uri) self.connectionUriCombo.setCurrentIndex(len(uri_history)) uri_history.append(uri) path = os.path.join(self._home, 'uri_history.txt') open(path, 'w').write('\n'.join(uri_history)) @Slot() def disconnectOneS(self): pythoncom.CoUninitialize() self._connection = None self.connectAction.setEnabled(True) self.disconnectAction.setDisabled(True) self.queryAction.setDisabled(True)
class ScratchPadWidget(QtGui.QWidget): def __init__(self, parent): """ Constructor This widget is kind of different. It does not exactly subclass CustomWidget """ QtGui.QWidget.__init__(self) self.name = "Scratchpad" self.parent = parent self.config = self.parent.config self.iconp = self.config.icons_path self.icon = QIcon(self.iconp + 'pencil.png') self._createGui() def _createGui(self): self._createScratchPadWindow() scratchpad_layout = QtGui.QVBoxLayout() save_btn = QtGui.QPushButton("Save to file", self) save_btn.setIcon(QIcon(self.iconp + 'save-download.png')) label = QtGui.QLabel("Write some notes here") scratchpad_layout.addWidget(label) scratchpad_layout.addWidget(self.scratchpad_window) scratchpad_layout.addWidget(save_btn) # Connect signals and slots save_btn.clicked.connect(self._saveButtonClicked) self.setLayout(scratchpad_layout) def _createScratchPadWindow(self): """ Some binary analysis commands will output to this. """ self.scratchpad_window = QTextEdit() self.scratchpad_window.setFontPointSize(9) ################################################################# # GUI Callbacks ################################################################# def _saveButtonClicked(self): try: filename, flt = QFileDialog.getSaveFileName( self, "File to save notes", "", selectedFilter = '*.txt') sp_text = self.scratchpad_window.toPlainText() with open(filename, 'w') as f: f.write(sp_text) print "Saved notes to \"%s\"" % filename except: print "[!] Problem saving notes..." print traceback.format_exc()