def __init__(self, context, signals): super(MainWindow, self).__init__() self.signals = signals self.context = context self.resize(800, 480) self.setWindowTitle(self.context.getText("pyqx", "title")) self.statusBar = self.statusBar() self.menuBar = self.createMenuBar() self.toolBar = self.createToolBar() self.createDockWidgets() self.ctrlPressed = False self.mainWidget = MainWidget(context, signals, self) self.setCentralWidget(self.mainWidget) self.imagePosLabel = QtWidgets.QLabel() self.imagePosLabel.setObjectName("ImagePosLabel") self.signals.autoUpdateTool.connect(self.setCurrentTool) self.signals.enterCanvas.connect(self.showImagePosition) self.signals.leaveCanvas.connect(self.hideImagePosition) self.signals.overCanvas.connect(self.setImagePosition) self.show()
def build(self): """ Construir o aplicativo """ # tags e endereços dos dados do MODBUS modbus_addrs = { # 'tag' : [endereço, multiplicador, tabela¹, unidade] # ¹tabela: 0 = coil; 1 - holding register 'estado_mot': [800, None, 0, None], 'freq_des': [799, 1, 1, 'Hz'], 't_part': [798, 10, 1, 's'], 'auto_control': [1000, None, 0, None], 'freq_mot': [800, 10, 1, 'Hz'], 'tensao': [801, 1, 1, 'V'], 'rotacao': [803, 1, 1, 'RPM'], 'pot_entrada': [804, 10, 1, 'W'], 'corrente': [805, 100, 1, 'A (RMS)'], 'temp_estator': [806, 10, 1, 'ºC'], 'vz_entrada': [807, 100, 1, 'L/s'], 'nivel': [808, 10, 1, 'L'], 'nivel_h': [809, None, 0, None], 'nivel_l': [810, None, 0, None], 'solenoide': [801, None, 0, None] } db_path = "G:\\Meu Drive\\UFJF\\Engenharia Eletrica\\2020-1\\04 - Informatica Industrial\\ERE\\Trabalhos\\Trabalho_2\\DK\\Supervisorio\\db\\scada.db" self._widget = MainWidget(scan_time=1000, server_ip='127.0.0.1', server_port=502, modbus_addrs=modbus_addrs, db_path=db_path) return self._widget
def main(): app = QApplication(sys.argv) w = MainWidget() w.setWindowTitle("Игра \"Жизнь\"") w.setFixedSize(w.geometry().width(), w.geometry().height()) w.show() return app.exec_()
def __init__(self, data, com): super(MainWindow,self).__init__() self.com = com self.data = data self.com.enterCanvas.connect(self.showImagePosition) self.com.leaveCanvas.connect(self.hideImagePosition) self.com.overCanvas.connect(self.setImagePosition) self.onClickPalette = False self.resize(800,480) self.setWindowTitle(self.data.getText("pix2pics", "title")) self.statusBar = self.statusBar() self.menuBar = self.createMenuBar() self.toolBar = self.createToolBar() self.createDockWidgets() self.mainWidget = MainWidget(128, 96, data, com, Qt.red, self) self.imagePosLabel = QtGui.QLabel() self.imagePosLabel.setObjectName("ImagePosLabel") # El Widget alrededor del cual gira la MainWindow es mainWidget self.setCentralWidget(self.mainWidget) self.show()
def __init__(self, context, signals): super(MainWindow, self).__init__() self.signals = signals self.context = context self.resize(800,480) self.setWindowTitle(self.context.getText("pyqx", "title")) self.statusBar = self.statusBar() self.menuBar = self.createMenuBar() self.toolBar = self.createToolBar() self.createDockWidgets() self.ctrlPressed = False self.mainWidget = MainWidget(context, signals, self) self.setCentralWidget(self.mainWidget) self.imagePosLabel = QtWidgets.QLabel() self.imagePosLabel.setObjectName("ImagePosLabel") self.signals.autoUpdateTool.connect(self.setCurrentTool) self.signals.enterCanvas.connect(self.showImagePosition) self.signals.leaveCanvas.connect(self.hideImagePosition) self.signals.overCanvas.connect(self.setImagePosition) self.show()
def __init__(self, app=None): #QMainWindow.__init__(self, None) super(MainWindow, self).__init__(None) self.setupUi(self) self.app = app self.iface = backend.pm.Iface() self.busy = QProgressIndicator(self) self.busy.setFixedSize(QSize(20, 20)) self.setWindowIcon( QIcon("/usr/share/package-manager/data/tray-zero.svg")) self.setCentralWidget(MainWidget(self)) self.cw = self.centralWidget() self.settingsDialog = SettingsDialog(self) self.initializeActions() self.initializeStatusBar() self.initializeTray() self.connectMainSignals() self.pdsMessageBox = PMessageBox(self)
def __init__(self): super(MainController, self).__init__() self.mainWidget = MainWidget() self.ControllerCommunication = ControllerCommunication() self.ControllerCommunication._consumingThread_() self.ControllerCommunication.Room1_led.connect(self.change_led_text1) self.ControllerCommunication.Room2_led.connect(self.change_led_text2) self.ControllerCommunication.Room1_music_track_name.connect(self.update_track_name1) self.ControllerCommunication.Room2_music_track_name.connect(self.update_track_name2) self.ControllerCommunication.Room1_music_status.connect(self.update_track_status1) self.ControllerCommunication.Room2_music_status.connect(self.update_track_status2) # self.ControllerCommunication.Room1_led_On_Msg.connect(self.update_text_led_on) # self.ControllerCommunication.Room2_led_On_Msg.connect(self.update_text_led2_on) # # self.ControllerCommunication.Room1_led_Off_Msg.connect(self.update_text_led_off) # self.ControllerCommunication.Room2_led_Off_Msg.connect(self.update_text_led2_off) self.ControllerCommunication.Room1_music_volume.connect(self.update_room1_volume) self.ControllerCommunication.Room2_music_volume.connect(self.update_room2_volume) self.mainWidget.ui.pushButton_5.clicked.connect(self.clear_text)
def __init__(self, parent=None): KXmlGuiWindow.__init__(self, parent) self.setupUi(self) self.setWindowIcon(KIcon(":/data/package-manager.png")) self.setCentralWidget(MainWidget(self)) self.settingsDialog = SettingsDialog(self) self.initializeActions() self.initializeStatusBar() self.initializeTray() self.connectMainSignals() self.offlinemanager = OfflineManager() self.connectOfflineSignals()
def __init__(self): super(MainController, self).__init__() self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE) self.wiflyReceiver = WiflyReceiver(self.ser) self.wiflySender = WiflySender(self.ser) self.rover = Rover() self.mainWidget = MainWidget() self.wiflyReceiverThread = QThread() self.wiflyReceiver.moveToThread(self.wiflyReceiverThread) self.wiflySenderThread = QThread() self.wiflySender.moveToThread(self.wiflySenderThread) self.simState = SIMULATION_STATE_PHASE_1 self.simTimer = QTimer() self.simTimer.setSingleShot(True) self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg) self.wiflyReceiver.msgReceived.connect(self.rover.processData) self.newCommand.connect(self.wiflySender.sendMsg) self.appStart.connect(self.wiflyReceiver.processMsg) self.mainWidget.ui.gearSlider.valueChanged.connect( self.manualGearChange) self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward) self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward) self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft) self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight) self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop) self.mainWidget.ui.simulationButton.clicked.connect( self.simulationStart) self.rover.newRoverPosition.connect(self.drawRover) self.rover.newWallDetected.connect(self.drawNewWall) self.simTimer.timeout.connect(self.simulationUpdate) self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO, WORLD_Y / CANVAS_RATIO) self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene) self.roverRect = QGraphicsRectItem() self.mapScene.addItem(self.roverRect) """
def setup_window(self): self.widget_stack = QStackedWidget(self) self.main_widget = MainWidget() self.exercise_widget = ExerciseWidget() self.exercise_view_widget = ViewWidget() self.widget_stack.addWidget(self.main_widget) self.widget_stack.addWidget(self.exercise_widget) self.widget_stack.addWidget(self.exercise_view_widget) self.main_widget.start_exercise_file.connect(self.show_exercise_window) self.main_widget.open_exercise_file.connect( self.show_exercise_view_widget) self.exercise_view_widget.return_button.clicked.connect( self.show_main_widget)
def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setWindowIcon(QtGui.QIcon(":/images/Ir_48x48.png")) self.centralViewer = MainWidget() self.settings = {} self.initSettngs() self.connect(self.centralViewer, QtCore.SIGNAL("quitclicked"), self.close) self.connect(self.centralViewer, QtCore.SIGNAL("settingsclicked"), self.doSettings) self.connect(self.centralViewer, QtCore.SIGNAL("aboutclicked"), self.doAbout) self.connect(self.centralViewer, QtCore.SIGNAL("registerclicked"), self.doRegister) self.connect(self.centralViewer, QtCore.SIGNAL("helpclicked"), self.doHelp) self.connect(self.centralViewer, QtCore.SIGNAL("doclicked"), self.doSettingsAndStart) self.setCentralWidget(self.centralViewer) self.createActions() self.createMenus() #self.createToolbar() self.has_registered = config.is_registered_fun() if self.has_registered: self.setWindowTitle( QtGui.QApplication.translate("main", "Hibosoft Batch Image Resizer", None, QtGui.QApplication.UnicodeUTF8)) else: self.setWindowTitle( QtGui.QApplication.translate( "main", "Hibosoft Batch Image Resizer ( Evaluation Version )", None, QtGui.QApplication.UnicodeUTF8))
def __init__(self, app=None): KXmlGuiWindow.__init__(self, None) self.setupUi(self) self.app = app self.iface = backend.pm.Iface() self.busy = QProgressIndicator(self) self.busy.setFixedSize(QSize(20, 20)) self.setWindowIcon(KIcon(":/data/package-manager.png")) self.setCentralWidget(MainWidget(self)) self.cw = self.centralWidget() self.settingsDialog = SettingsDialog(self) self.initializeActions() self.initializeStatusBar() self.initializeTray() self.connectMainSignals() self.pdsMessageBox = PMessageBox(self)
def __init__(self): super(MainController, self).__init__() self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE) self.wiflyReceiver = WiflyReceiver(self.ser) self.wiflySender = WiflySender(self.ser) self.rover = Rover() self.mainWidget = MainWidget() self.wiflyReceiverThread = QThread() self.wiflyReceiver.moveToThread(self.wiflyReceiverThread) self.wiflySenderThread = QThread() self.wiflySender.moveToThread(self.wiflySenderThread) self.simState = SIMULATION_STATE_PHASE_1 self.simTimer = QTimer() self.simTimer.setSingleShot(True) self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg) self.wiflyReceiver.msgReceived.connect(self.rover.processData) self.newCommand.connect(self.wiflySender.sendMsg) self.appStart.connect(self.wiflyReceiver.processMsg) self.mainWidget.ui.gearSlider.valueChanged.connect(self.manualGearChange) self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward) self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward) self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft) self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight) self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop) self.mainWidget.ui.simulationButton.clicked.connect(self.simulationStart) self.rover.newRoverPosition.connect(self.drawRover) self.rover.newWallDetected.connect(self.drawNewWall) self.simTimer.timeout.connect(self.simulationUpdate) self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO, WORLD_Y / CANVAS_RATIO) self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene) self.roverRect = QGraphicsRectItem() self.mapScene.addItem(self.roverRect) """
def __init__(self): super(MainWindow, self).__init__() uic.loadUi('main.ui', self) self.setWindowTitle(_App.APP_NAME) self.setWindowIcon(QIcon('./res/versaicon.png')) self.currentWidget = CurrentWidget.NONE self.mainwidget = MainWidget(self) #self.reviewwidget = ReviewWidget(self) self.mainStacked.addWidget(self.mainwidget) #self.mainStacked.addWidget(self.reviewwidget) self.actionExit.triggered.connect(self.close) self.actionDbClear.triggered.connect(self.mainwidget.on_dbclear_triggered) self.actionDbClearAll.triggered.connect(self.mainwidget.on_dbclearall_triggerd) self.actionDownloadFiles.triggered.connect(self.mainwidget.on_downloadfiles_triggered) self.actionReviewCount.triggered.connect(self.mainwidget.on_reviewcount_triggered) self.setMainWidget() self.showMaximized()
class MainController(QObject): appstart = pyqtSignal() def __init__(self): super(MainController, self).__init__() self.mainWidget = MainWidget() self.ControllerCommunication = ControllerCommunication() self.ControllerCommunication._consumingThread_() self.ControllerCommunication.Room1_led.connect(self.change_led_text1) self.ControllerCommunication.Room2_led.connect(self.change_led_text2) self.ControllerCommunication.Room1_music_track_name.connect(self.update_track_name1) self.ControllerCommunication.Room2_music_track_name.connect(self.update_track_name2) self.ControllerCommunication.Room1_music_status.connect(self.update_track_status1) self.ControllerCommunication.Room2_music_status.connect(self.update_track_status2) # self.ControllerCommunication.Room1_led_On_Msg.connect(self.update_text_led_on) # self.ControllerCommunication.Room2_led_On_Msg.connect(self.update_text_led2_on) # # self.ControllerCommunication.Room1_led_Off_Msg.connect(self.update_text_led_off) # self.ControllerCommunication.Room2_led_Off_Msg.connect(self.update_text_led2_off) self.ControllerCommunication.Room1_music_volume.connect(self.update_room1_volume) self.ControllerCommunication.Room2_music_volume.connect(self.update_room2_volume) self.mainWidget.ui.pushButton_5.clicked.connect(self.clear_text) """ Updating GUI elements for room 1 _ /' ) (_, | | | | | (_) """ @pyqtSlot(str) def change_led_text1(self, led1_status): """ change led text for room 1 :param led1_status: :return: """ self.mainWidget.ui.pushButton.setText(led1_status) self.mainWidget.ui.textEdit.insertPlainText("Turned room 1 light " + led1_status + " !") self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start) @pyqtSlot(str) def update_track_name1(self, track1_name): """ change music track name for room 1 :param track1_name: :return: """ self.mainWidget.ui.music_track_name_label.setText(track1_name) self.mainWidget.ui.textEdit.insertPlainText("Room 1 playing " + track1_name + "...") self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start) @pyqtSlot(str) def update_track_status1(self, track1_status): """ change music status name for room 2 :param track1_status: :return: """ self.mainWidget.ui.music_label_status.setText(track1_status) """ Updating GUI elements for room 2 __ /'__`\ (_) ) ) /' / /' /( ) (_____/' """ @pyqtSlot(str) def change_led_text2(self, led2_status): """ change led text for room 2 :param led2_status: :return: """ self.mainWidget.ui.pushButton_2.setText(led2_status) self.mainWidget.ui.textEdit.insertPlainText("Turned room 2 light " + led2_status + " !") self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start) @pyqtSlot(str) def update_track_name2(self, track2_name): """ change music status name for room 2 :param track2_name: :return: """ self.mainWidget.ui.music_track_name_label_2.setText(track2_name) self.mainWidget.ui.textEdit.insertPlainText("Room 2 playing " + track2_name + "...") self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start) @pyqtSlot(str) def update_track_status2(self, track2_status): """ change music status name for room 2 :param track2_status: :return: """ self.mainWidget.ui.music_label_status_2.setText(track2_status) @pyqtSlot(int) def update_room1_volume(self, num): self.mainWidget.ui.lcdNumber.display(num) @pyqtSlot(int) def update_room2_volume(self, num2): self.mainWidget.ui.lcdNumber_2.display(num2) # @pyqtSlot() # def update_text_led_on(self): # self.mainWidget.ui.textBrowser.append("Turned room 1 light on !") # # @pyqtSlot() # def update_text_led2_on(self): # self.mainWidget.ui.textBrowser.append("Turned room 2 light on !") # # @pyqtSlot() # def update_text_led_off(self): # self.mainWidget.ui.textBrowser.append("Turned room 1 light off !") # # @pyqtSlot() # def update_text_led2_off(self): # self.mainWidget.ui.textBrowser.append("Turned room 2 light off !") @pyqtSlot() def clear_text(self): self.mainWidget.ui.textEdit.clear() def start(self): self.mainWidget.show() self.mainWidget.showFullScreen() self.appstart.emit()
from mainwidget import MainWidget from PyQt5.QtWidgets import QApplication if __name__ == "__main__": app = QApplication([]) app.setStyle("Fusion") window = MainWidget() window.show() app.exec_()
class MainController(QObject): appStart = pyqtSignal() newCommand = pyqtSignal(tuple) def __init__(self): super(MainController, self).__init__() self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE) self.wiflyReceiver = WiflyReceiver(self.ser) self.wiflySender = WiflySender(self.ser) self.rover = Rover() self.mainWidget = MainWidget() self.wiflyReceiverThread = QThread() self.wiflyReceiver.moveToThread(self.wiflyReceiverThread) self.wiflySenderThread = QThread() self.wiflySender.moveToThread(self.wiflySenderThread) self.simState = SIMULATION_STATE_PHASE_1 self.simTimer = QTimer() self.simTimer.setSingleShot(True) self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg) self.wiflyReceiver.msgReceived.connect(self.rover.processData) self.newCommand.connect(self.wiflySender.sendMsg) self.appStart.connect(self.wiflyReceiver.processMsg) self.mainWidget.ui.gearSlider.valueChanged.connect(self.manualGearChange) self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward) self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward) self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft) self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight) self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop) self.mainWidget.ui.simulationButton.clicked.connect(self.simulationStart) self.rover.newRoverPosition.connect(self.drawRover) self.rover.newWallDetected.connect(self.drawNewWall) self.simTimer.timeout.connect(self.simulationUpdate) self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO, WORLD_Y / CANVAS_RATIO) self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene) self.roverRect = QGraphicsRectItem() self.mapScene.addItem(self.roverRect) """ rect1 = QGraphicsRectItem() rect2 = QGraphicsRectItem() self.mapScene.addItem(rect1) self.mapScene.addItem(rect2) rect1.setRect(100, 100, 20, 40) rect2.setRect(100, 100, 20, 40) #rect.moveBy(10, 50) rect2.setTransformOriginPoint(100, 100) rect2.setRotation(-10) print rect1.rect().center() #print rect2.transformOriginPoint().x(), rect2.transformOriginPoint().y() """ @pyqtSlot(tuple, tuple) def drawNewWall(self, wallFront, wallRear): pFront = QGraphicsRectItem(wallFront[0] / CANVAS_RATIO, wallFront[1] / CANVAS_RATIO, DOT_SIZE, DOT_SIZE) pRear = QGraphicsRectItem(wallRear[0] / CANVAS_RATIO, wallRear[1] / CANVAS_RATIO, DOT_SIZE, DOT_SIZE) self.mapScene.addItem(pFront) self.mapScene.addItem(pRear) @pyqtSlot(tuple, float) def drawRover(self, center, orientation): self.roverRect.setRect((center[0] - ROVER_WIDTH / 2) / CANVAS_RATIO, (center[1] - ROVER_LENGTH / 2) / CANVAS_RATIO, ROVER_WIDTH / CANVAS_RATIO, ROVER_LENGTH / CANVAS_RATIO) self.roverRect.setTransformOriginPoint(center[0] / CANVAS_RATIO, center[1] / CANVAS_RATIO) self.roverRect.setRotation(math.degrees(-orientation)) @pyqtSlot() def manualGearChange(self): gear = self.mainWidget.ui.gearSlider.value() self.mainWidget.ui.gearLcdNumber.display(gear) self.rover.roverGear = gear self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveForward(self): self.rover.roverDirection = ROVER_DIRECTION_FORWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveBackward(self): self.rover.roverDirection = ROVER_DIRECTION_BACKWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveLeft(self): self.rover.roverDirection = ROVER_DIRECTION_LEFT self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveRight(self): self.rover.roverDirection = ROVER_DIRECTION_RIGHT self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualStop(self): self.mainWidget.ui.gearSlider.setValue(0) @pyqtSlot() def simulationStart(self): self.simState == SIMULATION_STATE_PHASE_1 self.simTimer.start(5000) @pyqtSlot() def simulationUpdate(self): if self.simState == SIMULATION_STATE_PHASE_1: self.simState = SIMULATION_STATE_PHASE_2 self.rover.roverGear = 2 self.rover.roverDirection = ROVER_DIRECTION_FORWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(16000) elif self.simState == SIMULATION_STATE_PHASE_2: self.simState = SIMULATION_STATE_PHASE_3 self.rover.roverDirection = ROVER_DIRECTION_BACKWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(6100) elif self.simState == SIMULATION_STATE_PHASE_3: self.simState = SIMULATION_STATE_PHASE_4 self.rover.roverDirection = ROVER_DIRECTION_LEFT self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(3500) elif self.simState == SIMULATION_STATE_PHASE_4: self.simState = SIMULATION_STATE_PHASE_5 self.rover.roverDirection = ROVER_DIRECTION_BACKWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(8300) elif self.simState == SIMULATION_STATE_PHASE_5: self.rover.roverGear = 0 self.rover.roverDirection = ROVER_DIRECTION_STOP self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) def start(self): self.mainWidget.show() self.wiflyReceiverThread.start() self.wiflySenderThread.start() self.appStart.emit()
def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.mainwidget = MainWidget(self) self.setCentralWidget(self.mainwidget) self.setWindowTitle('Pocketpick')
def build(self): """ construtor """ self._widget = MainWidget() return self._widget
class MainWindow(QtWidgets.QMainWindow): def __init__(self, context, signals): super(MainWindow, self).__init__() self.signals = signals self.context = context self.resize(800,480) self.setWindowTitle(self.context.getText("pyqx", "title")) self.statusBar = self.statusBar() self.menuBar = self.createMenuBar() self.toolBar = self.createToolBar() self.createDockWidgets() self.ctrlPressed = False self.mainWidget = MainWidget(context, signals, self) self.setCentralWidget(self.mainWidget) self.imagePosLabel = QtWidgets.QLabel() self.imagePosLabel.setObjectName("ImagePosLabel") self.signals.autoUpdateTool.connect(self.setCurrentTool) self.signals.enterCanvas.connect(self.showImagePosition) self.signals.leaveCanvas.connect(self.hideImagePosition) self.signals.overCanvas.connect(self.setImagePosition) self.show() def createPopupMenu(self): pass # Reimplementando esta función conseguimos que no se creen los menús popup cuando hacemos click derecho en toolbars/dockwidgets. def createToolBarActions(self): l = [] self.tools = QtWidgets.QActionGroup(self) tools = ["selection", "magicwand", "pencil", "eraser", "colorpicker", "fill", "gradient", "exchange"] connects = [lambda: self.context.changeCurrentTool(Pixeler.Tools.Selection), lambda: self.context.changeCurrentTool(Pixeler.Tools.MagicWand), lambda: self.context.changeCurrentTool(Pixeler.Tools.Pencil), lambda: self.context.changeCurrentTool(Pixeler.Tools.Eraser), lambda: self.context.changeCurrentTool(Pixeler.Tools.ColorPicker), lambda: self.context.changeCurrentTool(Pixeler.Tools.Fill), lambda: self.context.changeCurrentTool(Pixeler.Tools.Gradient), lambda: self.context.changeCurrentTool(Pixeler.Tools.Exchange)] shortcuts = ['Z', '', 'X', 'C', 'A', 'S', 'D', ''] for i in range(len(tools)): a = QtWidgets.QAction(QtGui.QIcon( os.path.join("themes", self.context.theme, tools[i] + ".png") ), self.context.getText("tools", tools[i]) + " (" + shortcuts[i] + ")", self.tools) a.setCheckable(True) a.setShortcut(shortcuts[i]) if connects[i] != 0: a.toggled.connect(connects[i]) l.append(a) a = QtWidgets.QAction(QtGui.QIcon( os.path.join("themes", self.context.theme, "zoomin.png") ), self.context.getText("tools", "zoomin"), self.tools) a.setShortcut("Ctrl++") a.triggered.connect(self.zoomIn) l.append(a) a = QtWidgets.QAction(QtGui.QIcon( os.path.join("themes", self.context.theme, "zoomout.png") ), self.context.getText("tools", "zoomout"), self.tools) a.setShortcut("Ctrl+-") a.triggered.connect(self.zoomOut) l.append(a) l[self.context.currentTool].setChecked(True) return l def createToolBar(self): toolBar = QtWidgets.QToolBar() l = self.createToolBarActions() j = 0 for i in l: toolBar.addAction(i) if j == 7: toolBar.addSeparator() j += 1 toolBar.setMovable(False) toolBar.setOrientation(Qt.Vertical) self.addToolBar(Qt.LeftToolBarArea, toolBar) return toolBar def createFileActions(self): ids = ["new", "open", "save", "saveas", "exit"] icons = ["document-new.png", "document-open.png", "document-save.png", "document-save-as.png", "application-exit.png"] shortcuts = ['Ctrl+N', 'Ctrl+O', 'Ctrl+S', 'Ctrl+Shift+S', 'Ctrl+Q'] connects = [self.newFile, self.openFile, self.saveFile, self.saveFileAs, self.close] l = [] for i in range(len(ids)): a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_file_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.context.getText("menu_file_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) l.insert(4,0) # Los ceros simbolizan separadores return l def createEditActions(self): ids = ["undo", "redo", "selectall", "deselect", "cut", "copy", "paste", "clear", "preferences"] icons = ["edit-undo.png", "edit-redo.png", "", "", "edit-cut.png", "edit-copy.png", "edit-paste.png", "edit-clear.png", "document-properties.png"] shortcuts = ['Ctrl+Z', 'Ctrl+Y', "Ctrl+A", "Ctrl+Shift+A", 'Ctrl+X', 'Ctrl+C', 'Ctrl+V', 'Del', ''] connects = [self.undo, self.redo, self.selectAll, self.deselect, self.cut, self.copy, self.paste, self.clear, self.showPreferences] l = [] for i in range(len(ids)): a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_edit_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.context.getText("menu_edit_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) # Los ceros simbolizan separadores l.insert(2,0) l.insert(5,0) l.insert(10,0) return l def createViewActions(self): ids = ["pixel_grid", "matrix_grid"] icons = ["", ""] shortcuts = ['Ctrl+G', 'Ctrl+M'] connects = [self.setPixelGrid, self.setMatrixGrid] l = [] for i in range(len(ids)): a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_view_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.context.getText("menu_view_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) a.setCheckable(True) l.append(a) l.insert(2,0) # Los ceros simbolizan separadores # Algunas opcionas son chekables, lo consideramos: l[0].setCheckable(True) if self.context.grid: l[0].setChecked(True) l[1].setCheckable(True) if self.context.matrixGrid: l[1].setChecked(True) return l def createTransformActions(self): ids = ["flip_hor", "flip_ver", "rotate_cw", "rotate_ccw", "rotate_180", "resize", "resize_canvas"] icons = ["", "", "", "", "", "", ""] shortcuts = ['', '', '', '', '', '', ''] connects = [self.flipHorizontally,self.flipVertically,self.rotate90CW,self.rotate90CCW,self.rotate180,self.showResizeImageDialog,self.showResizeCanvasDialog] l = [] for i in range(len(ids)): a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_transform_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.context.getText("menu_transform_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) # Los ceros simbolizan separadores l.insert(2,0) l.insert(6,0) return l def createHelpActions(self): ids = ["contents", "about"] icons = ["help-contents.png", "help-about.png"] shortcuts = ['F1', 'Ctrl+B'] connects = [self.showHelp, self.showAboutDialog] l = [] for i in range(len(ids)): a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_help_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.context.getText("menu_help_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) l.insert(1,0) # Los ceros simbolizan separadores return l def createMenuBar(self): menubar = self.menuBar() fileMenu = menubar.addMenu(self.context.getText("menu", "file")) editMenu = menubar.addMenu(self.context.getText("menu", "edit")) viewMenu = menubar.addMenu(self.context.getText("menu", "view")) transformMenu = menubar.addMenu(self.context.getText("menu", "transform")) helpMenu = menubar.addMenu(self.context.getText("menu", "help")) fileActions = self.createFileActions() editActions = self.createEditActions() viewActions = self.createViewActions() transformActions = self.createTransformActions() helpActions = self.createHelpActions() for i in fileActions: if i == 0: fileMenu.addSeparator() else: fileMenu.addAction(i) for i in editActions: if i == 0: editMenu.addSeparator() else: editMenu.addAction(i) for i in viewActions: if i == 0: viewMenu.addSeparator() else: viewMenu.addAction(i) for i in helpActions: if i == 0: helpMenu.addSeparator() else: helpMenu.addAction(i) for i in transformActions: if i == 0: transformMenu.addSeparator() else: transformMenu.addAction(i) return menubar def createDockWidgets(self): # Palette widget self.palette = QtWidgets.QDockWidget(self.context.getText("dock_widgets", "palette"), self) self.palette.setAllowedAreas(Qt.RightDockWidgetArea) self.palette.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures) paletteWidget = Palette(self.context, self.signals) self.palette.setWidget(paletteWidget) self.palette.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.addDockWidget(Qt.RightDockWidgetArea, self.palette) # Tool Properties widget self.toolProperties = ToolProperties(self.context.getText("dock_widgets", "tool_properties"), self.context, self.signals) self.addDockWidget(Qt.RightDockWidgetArea, self.toolProperties) self.toolProperties.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) # Preview self.preview = Preview(self.context.getText("dock_widgets", "preview"), self.context, self.signals, self) self.addDockWidget(Qt.RightDockWidgetArea, self.preview) def restoreFocus(self): print("Restoring Focus") self.ctrlPressed = False self.releaseMouse() self.releaseKeyboard() QtCore.QCoreApplication.instance().restoreOverrideCursor() def setCurrentTool(self, index): self.tools.actions()[0].setChecked(True) self.signals.updateTool.emit(0) def zoomIn(self): if self.context.currentImage().zoom < 25: self.context.currentImage().zoom += 1 self.signals.zoom.emit() def zoomOut(self): if self.context.currentImage().zoom > 1: self.context.currentImage().zoom -= 1 self.signals.zoom.emit() def newFile(self): d = NewFileDialog(self.context, self) def openFile(self): fileName = QtWidgets.QFileDialog.getOpenFileName(self, self.context.getText("dialog_open", "title"), "/home", self.context.getText("dialog_open", "images") + u" (*.bmp *.gif *.png *.xpm *.jpg);;" + self.context.getText("dialog_open", "all_files") + u" (*)") if fileName: self.context.loadImage(fileName) def saveFile(self): if self.context.currentImage().fileName == "": self.saveFileAs() else: self.context.currentImage().save() def saveFileAs(self): d = QtWidgets.QFileDialog() fileName, filterName = d.getSaveFileName(self, self.context.getText("dialog_save", "title"), "", "*.bmp;;*.gif;;*.png;;*.xpm;;*.jpg") if fileName.split(".")[-1] in ["bmp", "gif", "png", "xpm", "jpg"]: self.context.currentImage().fileName = fileName self.signals.fileNameChanged.emit(self.context.getCurrentImagePos(), os.path.basename(str(fileName))) else: self.context.currentImage().fileName = fileName + filterName[1:] self.signals.fileNameChanged.emit(self.context.getCurrentImagePos(), os.path.basename(str(fileName + filterName[1:]))) self.context.currentImage().save() def close(self): pass def undo(self): if self.context.currentImage().posHistory > 0: self.context.currentImage().posHistory -= 1 self.context.currentImage().image = QtWidgets.QImage(self.context.currentImage().history[self.context.currentImage().posHistory]) self.signals.updateCanvas.emit() self.signals.resizeCanvas.emit() def redo(self): if self.context.currentImage().posHistory < len(self.context.currentImage().history)-1: self.context.currentImage().posHistory += 1 self.context.currentImage().image = QtWidgets.QImage(self.context.currentImage().history[self.context.currentImage().posHistory]) self.signals.updateCanvas.emit() self.signals.resizeCanvas.emit() def selectAll(self): self.mainWidget.currentWidget().canvas.selectAll() def deselect(self): self.mainWidget.currentWidget().canvas.applySelection() def cut(self): self.signals.cutImage.emit() def copy(self): self.signals.copyImage.emit() def paste(self): clipboard = QtWidgets.QApplication.clipboard() if not clipboard.image().isNull(): self.signals.pasteImage.emit() self.signals.updateCanvas.emit() def clear(self): self.signals.clearImage.emit() def showPreferences(self): d = Preferences(self.context, self.signals, self) def setPixelGrid(self): self.context.grid = not self.context.grid self.signals.updateCanvas.emit() self.context.setDefault("grid", "grid", self.context.grid) def setMatrixGrid(self): self.context.matrixGrid = not self.context.matrixGrid self.signals.updateCanvas.emit() self.context.setDefault("grid", "matrix_grid", self.context.matrixGrid) def flipHorizontally(self): pass def flipVertically(self): pass def rotate90CW(self): pass def rotate90CCW(self): pass def rotate180(self): pass def showResizeImageDialog(self): pass def showResizeCanvasDialog(self): pass def showHelp(self): pass def showAboutDialog(self): pass def showImagePosition(self): if self.imagePosLabel.isHidden(): self.statusBar.insertWidget(0, self.imagePosLabel, 0) self.imagePosLabel.show() def hideImagePosition(self): self.statusBar.removeWidget(self.imagePosLabel) def setImagePosition(self, x, y): self.imagePosLabel.setText(" Pos: (" + str(x) + ", " + str(y) + ")") def keyPressEvent(self, event): super(MainWindow, self).keyPressEvent(event) if event.key() == Qt.Key_Control: print("Control Pressed") self.ctrlPressed = True QtCore.QCoreApplication.instance().setOverrideCursor(self.context.colorPickerCur) self.signals.ctrlPressed.emit() self.grabMouse() self.grabKeyboard() elif event.key() == Qt.Key_Plus: if self.context.currentTool == 1: self.context.setPencilSize(self.context.pencilSize+1) elif self.context.currentTool == 2: self.context.setEraserSize(self.context.eraserSize+1) elif event.key() == Qt.Key_Minus: if self.context.currentTool == 1: self.context.setPencilSize(self.context.pencilSize-1) elif self.context.currentTool == 2: self.context.setEraserSize(self.context.eraserSize-1) else: QtCore.QCoreApplication.instance().restoreOverrideCursor() self.releaseMouse() self.releaseKeyboard() def keyReleaseEvent(self, event): super(MainWindow, self).keyReleaseEvent(event) if event.key() == Qt.Key_Control: self.ctrlPressed = False QtCore.QCoreApplication.instance().restoreOverrideCursor() self.releaseMouse() self.releaseKeyboard() def mousePressEvent(self, event): super(MainWindow, self).mousePressEvent(event) if self.ctrlPressed: print("Picking Desktop Color") widget = QtCore.QCoreApplication.instance().desktop().screen() im = QtWidgets.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos())) # Cogemos el color de la posición del cursor if event.button() == Qt.LeftButton: self.context.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido elif event.button() == Qt.RightButton: self.context.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido # im.save("desktop.png") # Guardar la captura de pantalla en un archivo # print "Getting color " + c.red(), c.green(), c.blue() + " from screen" # Comprueba qué color coge def mouseMoveEvent(self, event): super(MainWindow, self).mouseMoveEvent(event) # Lo mismo de antes pero para cuando el ratón se mueve if self.ctrlPressed: widget = QtCore.QCoreApplication.instance().desktop().screen() im = QtWidgets.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos())) # Cogemos el color de la posición del cursor if event.buttons() == Qt.LeftButton: self.context.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido elif event.buttons() == Qt.RightButton: self.context.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido def wheelEvent(self, event): if self.ctrlPressed: if event.delta() > 0: self.zoomIn() else: self.zoomOut() super(MainWindow, self).wheelEvent(event) def closeEvent(self, event): l = [] for i in range(len(self.context.images)): if self.context.images[i].modified: l.append(i) if len(l) > 0: # Mostrar diálogo reply = QtWidgets.QMessageBox.warning(self, self.context.getText("dialog_exit", "title"), self.context.getText("dialog_exit", "message"), QtWidgets.QMessageBox.SaveAll | QtWidgets.QMessageBox.Discard | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel) if reply == QtWidgets.QMessageBox.Discard: event.accept() elif reply == QtWidgets.QMessageBox.Cancel: event.ignore() return elif reply == QtWidgets.QMessageBox.SaveAll: for i in l: self.mainWidget.setCurrentIndex(i) self.context.setCurrentImagePos(i) self.saveFile() event.accept() return self.context.saveDefaults() super(MainWindow, self).closeEvent(event)
import sys from PySide6.QtWidgets import QApplication from mainwidget import MainWidget if __name__ == "__main__": app = QApplication(sys.argv) widget = MainWidget() widget.show() sys.exit(app.exec_())
def build(self): mw = MainWidget() Clock.schedule_interval(mw.update, 0.05) return mw
class MainController(QObject): appStart = pyqtSignal() newCommand = pyqtSignal(tuple) def __init__(self): super(MainController, self).__init__() self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE) self.wiflyReceiver = WiflyReceiver(self.ser) self.wiflySender = WiflySender(self.ser) self.rover = Rover() self.mainWidget = MainWidget() self.wiflyReceiverThread = QThread() self.wiflyReceiver.moveToThread(self.wiflyReceiverThread) self.wiflySenderThread = QThread() self.wiflySender.moveToThread(self.wiflySenderThread) self.simState = SIMULATION_STATE_PHASE_1 self.simTimer = QTimer() self.simTimer.setSingleShot(True) self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg) self.wiflyReceiver.msgReceived.connect(self.rover.processData) self.newCommand.connect(self.wiflySender.sendMsg) self.appStart.connect(self.wiflyReceiver.processMsg) self.mainWidget.ui.gearSlider.valueChanged.connect( self.manualGearChange) self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward) self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward) self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft) self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight) self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop) self.mainWidget.ui.simulationButton.clicked.connect( self.simulationStart) self.rover.newRoverPosition.connect(self.drawRover) self.rover.newWallDetected.connect(self.drawNewWall) self.simTimer.timeout.connect(self.simulationUpdate) self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO, WORLD_Y / CANVAS_RATIO) self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene) self.roverRect = QGraphicsRectItem() self.mapScene.addItem(self.roverRect) """ rect1 = QGraphicsRectItem() rect2 = QGraphicsRectItem() self.mapScene.addItem(rect1) self.mapScene.addItem(rect2) rect1.setRect(100, 100, 20, 40) rect2.setRect(100, 100, 20, 40) #rect.moveBy(10, 50) rect2.setTransformOriginPoint(100, 100) rect2.setRotation(-10) print rect1.rect().center() #print rect2.transformOriginPoint().x(), rect2.transformOriginPoint().y() """ @pyqtSlot(tuple, tuple) def drawNewWall(self, wallFront, wallRear): pFront = QGraphicsRectItem(wallFront[0] / CANVAS_RATIO, wallFront[1] / CANVAS_RATIO, DOT_SIZE, DOT_SIZE) pRear = QGraphicsRectItem(wallRear[0] / CANVAS_RATIO, wallRear[1] / CANVAS_RATIO, DOT_SIZE, DOT_SIZE) self.mapScene.addItem(pFront) self.mapScene.addItem(pRear) @pyqtSlot(tuple, float) def drawRover(self, center, orientation): self.roverRect.setRect((center[0] - ROVER_WIDTH / 2) / CANVAS_RATIO, (center[1] - ROVER_LENGTH / 2) / CANVAS_RATIO, ROVER_WIDTH / CANVAS_RATIO, ROVER_LENGTH / CANVAS_RATIO) self.roverRect.setTransformOriginPoint(center[0] / CANVAS_RATIO, center[1] / CANVAS_RATIO) self.roverRect.setRotation(math.degrees(-orientation)) @pyqtSlot() def manualGearChange(self): gear = self.mainWidget.ui.gearSlider.value() self.mainWidget.ui.gearLcdNumber.display(gear) self.rover.roverGear = gear self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveForward(self): self.rover.roverDirection = ROVER_DIRECTION_FORWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveBackward(self): self.rover.roverDirection = ROVER_DIRECTION_BACKWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveLeft(self): self.rover.roverDirection = ROVER_DIRECTION_LEFT self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualMoveRight(self): self.rover.roverDirection = ROVER_DIRECTION_RIGHT self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) @pyqtSlot() def manualStop(self): self.mainWidget.ui.gearSlider.setValue(0) @pyqtSlot() def simulationStart(self): self.simState == SIMULATION_STATE_PHASE_1 self.simTimer.start(5000) @pyqtSlot() def simulationUpdate(self): if self.simState == SIMULATION_STATE_PHASE_1: self.simState = SIMULATION_STATE_PHASE_2 self.rover.roverGear = 2 self.rover.roverDirection = ROVER_DIRECTION_FORWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(16000) elif self.simState == SIMULATION_STATE_PHASE_2: self.simState = SIMULATION_STATE_PHASE_3 self.rover.roverDirection = ROVER_DIRECTION_BACKWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(6100) elif self.simState == SIMULATION_STATE_PHASE_3: self.simState = SIMULATION_STATE_PHASE_4 self.rover.roverDirection = ROVER_DIRECTION_LEFT self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(3500) elif self.simState == SIMULATION_STATE_PHASE_4: self.simState = SIMULATION_STATE_PHASE_5 self.rover.roverDirection = ROVER_DIRECTION_BACKWARD self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) self.simTimer.start(8300) elif self.simState == SIMULATION_STATE_PHASE_5: self.rover.roverGear = 0 self.rover.roverDirection = ROVER_DIRECTION_STOP self.rover.updateMotorCommand() self.newCommand.emit(tuple(self.rover.commandMsg)) def start(self): self.mainWidget.show() self.wiflyReceiverThread.start() self.wiflySenderThread.start() self.appStart.emit()
class MainWindow(QtGui.QMainWindow): """ La clase MainWindow es la ventana principal del programa. """ def __init__(self, data, com): super(MainWindow,self).__init__() self.com = com self.data = data self.com.enterCanvas.connect(self.showImagePosition) self.com.leaveCanvas.connect(self.hideImagePosition) self.com.overCanvas.connect(self.setImagePosition) self.onClickPalette = False self.resize(800,480) self.setWindowTitle(self.data.getText("pix2pics", "title")) self.statusBar = self.statusBar() self.menuBar = self.createMenuBar() self.toolBar = self.createToolBar() self.createDockWidgets() self.mainWidget = MainWidget(128, 96, data, com, Qt.red, self) self.imagePosLabel = QtGui.QLabel() self.imagePosLabel.setObjectName("ImagePosLabel") # El Widget alrededor del cual gira la MainWindow es mainWidget self.setCentralWidget(self.mainWidget) self.show() def createPopupMenu(self): pass # Reimplementando esta función conseguimos que no se creen los menús popup cuando hacemos click derecho en toolbars/dockwidgets. def createToolBarActions(self): # Llista d'accions l = [] self.tools = QtGui.QActionGroup(self) tools = ["selection", "pencil", "eraser", "colorpicker", "fill", "gradient", "exchange"] connects = [self.setSelectionTool, self.setPencilTool, self.setEraserTool, self.setColorPickerTool, self.setFillTool, self.setGradientTool, self.setExchangeTool] shortcuts = ['Z', 'X', 'C', 'A', 'S', 'D', ''] for i in range(len(tools)): a = QtGui.QAction(QtGui.QIcon( os.path.join("themes", self.data.theme, tools[i] + ".png") ), self.data.getText("tools", tools[i]) + " (" + shortcuts[i] + ")", self.tools) a.setCheckable(True) a.setShortcut(shortcuts[i]) if connects[i] != 0: a.toggled.connect(connects[i]) l.append(a) a = QtGui.QAction(QtGui.QIcon( os.path.join("themes", self.data.theme, "zoomin.png") ), self.data.getText("tools", "zoomin"), self.tools) a.setShortcut("Ctrl++") a.triggered.connect(self.zoomIn) l.append(a) a = QtGui.QAction(QtGui.QIcon( os.path.join("themes", self.data.theme, "zoomout.png") ), self.data.getText("tools", "zoomout"), self.tools) a.setShortcut("Ctrl+-") a.triggered.connect(self.zoomOut) l.append(a) l[self.data.currentTool].setChecked(True) return l def createToolBar(self): toolBar = QtGui.QToolBar() l = self.createToolBarActions() j = 0 for i in l: toolBar.addAction(i) if j == 6: toolBar.addSeparator() j += 1 toolBar.setMovable(False) toolBar.setOrientation(Qt.Vertical) self.addToolBar(Qt.LeftToolBarArea, toolBar) return toolBar def createFileActions(self): # Llistes de propietats (de cada acció) ids = ["new", "open", "save", "saveas", "exit"] icons = ["document-new.png", "document-open.png", "document-save.png", "document-save-as.png", "application-exit.png"] shortcuts = ['Ctrl+N', 'Ctrl+O', 'Ctrl+S', 'Ctrl+Shift+S', 'Ctrl+Q'] connects = [self.showNewFileDialog, self.openFile, self.saveFile, self.saveFileAs, self.close] # Llista d'accions l = [] for i in range(len(ids)): a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_file_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.data.getText("menu_file_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) # Insertem els zeros que simbolitzen separadors l.insert(4,0) return l def createEditActions(self): # Llistes de propietats (de cada acció) ids = ["undo", "redo", "selectall", "deselect", "invert", "cut", "copy", "paste", "clear", "preferences"] icons = ["edit-undo.png", "edit-redo.png", "", "", "", "edit-cut.png", "edit-copy.png", "edit-paste.png", "edit-clear.png", "document-properties.png"] shortcuts = ['Ctrl+Z', 'Ctrl+Y', "", "", "", 'Ctrl+X', 'Ctrl+C', 'Ctrl+V', 'Del', ''] connects = [self.undo, self.redo, 0, 0, 0, self.cut, self.copy, self.paste, self.clear, self.showPreferences] # Llista d'accions l = [] for i in range(len(ids)): a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_edit_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.data.getText("menu_edit_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) # Insertem els zeros que simbolitzen separadors l.insert(2,0) l.insert(6,0) l.insert(11,0) return l def createViewActions(self): # Llistes de propietats (de cada acció) ids = ["pixel_grid", "matrix_grid"] icons = ["", ""] shortcuts = ['Ctrl+G', 'Ctrl+M'] connects = [self.setPixelGrid, self.setMatrixGrid] # Llista d'accions l = [] for i in range(len(ids)): a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_view_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.data.getText("menu_view_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) a.setCheckable(True) l.append(a) # Insertem els zeros que simbolitzen separadors l.insert(2,0) # Algunas opcionas son chekables, lo consideramos: l[0].setCheckable(True) if self.data.grid: l[0].setChecked(True) l[1].setCheckable(True) if self.data.matrixGrid: l[1].setChecked(True) return l def createTransformActions(self): # Llistes de propietats (de cada acció) ids = ["flip_hor", "flip_ver", "rotate_cw", "rotate_ccw", "rotate_180", "resize", "resize_canvas"] icons = ["", "", "", "", "", "", ""] shortcuts = ['', '', '', '', '', '', ''] connects = [self.flipHorizontally,self.flipVertically,self.rotate90CW,self.rotate90CCW,self.rotate180,self.showResizeImageDialog,self.showResizeCanvasDialog] # Llista d'accions l = [] for i in range(len(ids)): a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_transform_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.data.getText("menu_transform_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) l.insert(2,0) l.insert(6,0) return l def createHelpActions(self): # Llistes de propietats (de cada acció) ids = ["contents", "about"] icons = ["help-contents.png", "help-about.png"] shortcuts = ['F1', 'Ctrl+B'] connects = [self.showHelp, self.showAboutDialog] # Llista d'accions l = [] for i in range(len(ids)): a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_help_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip(self.data.getText("menu_help_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) # Insertem els zeros que simbolitzen separadors l.insert(1,0) return l def restoreFocus(self): self.releaseMouse() self.releaseKeyboard() QtCore.QCoreApplication.instance().restoreOverrideCursor() def createMenuBar(self): menubar = self.menuBar() fileMenu = menubar.addMenu(self.data.getText("menu", "file")) editMenu = menubar.addMenu(self.data.getText("menu", "edit")) viewMenu = menubar.addMenu(self.data.getText("menu", "view")) transformMenu = menubar.addMenu(self.data.getText("menu", "transform")) helpMenu = menubar.addMenu(self.data.getText("menu", "help")) fileActions = self.createFileActions() editActions = self.createEditActions() viewActions = self.createViewActions() transformActions = self.createTransformActions() helpActions = self.createHelpActions() for i in fileActions: if i == 0: fileMenu.addSeparator() else: fileMenu.addAction(i) for i in editActions: if i == 0: editMenu.addSeparator() else: editMenu.addAction(i) for i in viewActions: if i == 0: viewMenu.addSeparator() else: viewMenu.addAction(i) for i in helpActions: if i == 0: helpMenu.addSeparator() else: helpMenu.addAction(i) for i in transformActions: if i == 0: transformMenu.addSeparator() else: transformMenu.addAction(i) return menubar def createDockWidgets(self): # Palette widget self.palette = QtGui.QDockWidget(self.data.getText("dock_widgets", "palette"), self) self.palette.setAllowedAreas(Qt.RightDockWidgetArea) self.palette.setFeatures(QtGui.QDockWidget.NoDockWidgetFeatures) paletteWidget = Palette(self.data, self.com) self.palette.setWidget(paletteWidget) self.palette.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum) self.addDockWidget(Qt.RightDockWidgetArea, self.palette) # Tool Properties widget self.toolProperties = ToolProperties(self.data.getText("dock_widgets", "tool_properties"), self.data, self.com) self.addDockWidget(Qt.RightDockWidgetArea, self.toolProperties) self.palette.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) # Preview self.preview = Preview(self.data.getText("dock_widgets", "preview"), self.data, self.com, self) self.addDockWidget(Qt.RightDockWidgetArea, self.preview) def zoomIn(self): if self.data.zoom < 25: self.data.zoom += 1 #self.mainWidget.canvas.setFixedSize(self.data.image.width()*self.data.zoom, self.data.image.height()*self.data.zoom) self.scaleImage(self.data.zoom) self.mainWidget.canvas.update() self.com.zoom.emit() def zoomOut(self): if self.data.zoom > 1: self.data.zoom -= 1 #self.mainWidget.canvas.setFixedSize(self.data.image.width()*self.data.zoom, self.data.image.height()*self.data.zoom) self.scaleImage(self.data.zoom) self.mainWidget.canvas.update() self.com.zoom.emit() def scaleImage(self, zoom): #self.mainWidget.canvas.resize(zoom * self.data.image.size()) self.com.resizeCanvas.emit() self.adjustScrollBar(self.mainWidget.horizontalScrollBar(), zoom) self.adjustScrollBar(self.mainWidget.verticalScrollBar(), zoom) def adjustScrollBar(self, scrollBar, zoom): scrollBar.setValue((scrollBar.maximum() - scrollBar.minimum()) / 2) def flipHorizontally(self): self.data.flipHorizontally() self.com.updateCanvas.emit() def flipVertically(self): self.data.flipVertically() self.com.updateCanvas.emit() def rotate90CW(self): self.data.rotate90CW() self.com.updateCanvas.emit() if not self.data.selection: self.com.newImage.emit() def rotate90CCW(self): self.data.rotate90CCW() self.com.updateCanvas.emit() if not self.data.selection: self.com.newImage.emit() def rotate180(self): self.data.rotate180() self.com.updateCanvas.emit() def showResizeImageDialog(self): d = ResizeImageDialog(self) def showResizeCanvasDialog(self): d = ResizeCanvasDialog(self) def setPencilSize(self, size): self.pencilSize.setText(str(size)) self.data.pencilSize = size def setSelectionTool(self): self.data.currentTool = 0 self.com.updateTool.emit() def setPencilTool(self): self.data.currentTool = 1 self.com.updateTool.emit() def setEraserTool(self): self.data.currentTool = 2 self.com.updateTool.emit() def setColorPickerTool(self): self.data.currentTool = 3 self.com.updateTool.emit() def setFillTool(self): self.data.currentTool = 4 self.com.updateTool.emit() def setGradientTool(self): self.data.currentTool = 5 self.com.updateTool.emit() def setExchangeTool(self): self.data.currentTool = 6 self.com.updateTool.emit() def showImagePosition(self): if self.imagePosLabel.isHidden(): self.imagePosLabel.setText( str(self.data.ximage) + str(self.data.yimage) ) self.statusBar.insertWidget(0, self.imagePosLabel, 0) self.imagePosLabel.show() #self.imagePosLabel.move(self.statusBar.width()/2,self.imagePosLabel.y()) def hideImagePosition(self): self.statusBar.removeWidget(self.imagePosLabel) def setImagePosition(self, x, y): self.imagePosLabel.setText(" Pos: (" + str(x) + ", " + str(y) + ")") def showNewFileDialog(self): d = NewFileDialog(self.data, self) def showHelp(self): url = QtCore.QUrl("http://nataczajohnson.wix.com/pixs2pics#!page3/cee5") QtGui.QDesktopServices.openUrl(url) def showAboutDialog(self): d = QtGui.QMessageBox.about(self, self.data.getText("dialog_about", "title"), self.data.getText("dialog_about", "description")) def showPreferences(self): d = Preferences(self.data, self.com, self) def newImage(self, w, h): self.data.newImage(w, h) def openFile(self): fileName = QtGui.QFileDialog.getOpenFileName(self, self.data.getText("dialog_open", "title"), "/home", self.data.getText("dialog_open", "images") + u" (*.bmp *.gif *.png *.xpm *.jpg);;" + self.data.getText("dialog_open", "all_files") + u" (*)") if fileName: self.data.loadImage(fileName) def saveFile(self): if self.data.defaultFileName == "": self.saveFileAs() else: self.data.image.save(self.data.defaultFileName) def saveFileAs(self): d = QtGui.QFileDialog() fileName, filterName = d.getSaveFileNameAndFilter(self, self.data.getText("dialog_save", "title"), "", "*.bmp;;*.gif;;*.png;;*.xpm;;*.jpg") self.data.image.save(fileName+filterName[1:]) self.data.defaultFileName = fileName + filterName[1:] def undo(self): if self.data.posHistory > 0: self.data.posHistory -= 1 self.data.image = QtGui.QImage(self.data.history[self.data.posHistory]) self.com.updateCanvas.emit() self.com.resizeCanvas.emit() def redo(self): if self.data.posHistory < len(self.data.history)-1: self.data.posHistory += 1 self.data.image = QtGui.QImage(self.data.history[self.data.posHistory]) self.com.updateCanvas.emit() self.com.resizeCanvas.emit() def cut(self): self.com.cutImage.emit() def copy(self): self.com.copyImage.emit() def paste(self): clipboard = QtGui.QApplication.clipboard() if not clipboard.image().isNull(): self.com.pasteImage.emit() self.com.updateCanvas.emit() def clear(self): self.com.clearImage.emit() def setPixelGrid(self): self.data.grid = not self.data.grid self.com.updateCanvas.emit() self.data.setDefault("grid", "grid", self.data.grid) def setMatrixGrid(self): self.data.matrixGrid = not self.data.matrixGrid self.com.updateCanvas.emit() self.data.setDefault("grid", "matrix_grid", self.data.matrixGrid) def keyPressEvent(self, event): super(MainWindow, self).keyPressEvent(event) if event.key() == Qt.Key_Control: self.onClickPalette = True QtCore.QCoreApplication.instance().setOverrideCursor(self.data.colorPickerCur) self.com.onClickPalette.emit() self.grabMouse() #self.grabKeyboard() elif event.key() == Qt.Key_Plus: if self.data.currentTool == 1: self.data.setPencilSize(self.data.pencilSize+1) elif self.data.currentTool == 2: self.data.setEraserSize(self.data.eraserSize+1) elif event.key() == Qt.Key_Minus: if self.data.currentTool == 1: self.data.setPencilSize(self.data.pencilSize-1) elif self.data.currentTool == 2: self.data.setEraserSize(self.data.eraserSize-1) else: QtCore.QCoreApplication.instance().restoreOverrideCursor() self.releaseMouse() self.releaseKeyboard() def keyReleaseEvent(self, event): super(MainWindow, self).keyReleaseEvent(event) if event.key() == Qt.Key_Control: self.onClickPalette = False QtCore.QCoreApplication.instance().restoreOverrideCursor() self.releaseMouse() self.releaseKeyboard() def mousePressEvent(self, event): super(MainWindow, self).mousePressEvent(event) # --- Paleta "onClick" --- # Cuando pulsamos Ctrl y hacemos click con el mouse creamos una captura de pantalla. # Luego de esa captura extraemos el color en la posición del cursor y lo establecemos # como color principal. if self.onClickPalette: widget = QtCore.QCoreApplication.instance().desktop().screen() im = QtGui.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla c = QtGui.QColor(im.pixel(QtGui.QCursor.pos())) # Cogemos el color de la posición del cursor if event.button() == Qt.LeftButton: self.data.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido elif event.button() == Qt.RightButton: self.data.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido # im.save("desktop.png") # Guardar la captura de pantalla en un archivo # print "Getting color " + c.red(), c.green(), c.blue() + " from screen" # Comprueba qué color coge def mouseMoveEvent(self, event): super(MainWindow, self).mouseMoveEvent(event) # Lo mismo de antes pero para cuando el ratón se mueve if self.onClickPalette: widget = QtCore.QCoreApplication.instance().desktop().screen() im = QtGui.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla c = QtGui.QColor(im.pixel(QtGui.QCursor.pos())) # Cogemos el color de la posición del cursor if event.buttons() == Qt.LeftButton: self.data.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido elif event.buttons() == Qt.RightButton: self.data.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido def wheelEvent(self, event): if self.onClickPalette: if event.delta() > 0: self.zoomIn() else: self.zoomOut() super(MainWindow, self).wheelEvent(event) def closeEvent(self, event): reply = QtGui.QMessageBox.warning(self, self.data.getText("dialog_exit", "title"), self.data.getText("dialog_exit", "message"), QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Save) if reply == QtGui.QMessageBox.Discard: event.accept() elif reply == QtGui.QMessageBox.Cancel: event.ignore() return elif reply == QtGui.QMessageBox.Save: self.saveFile() event.accept() self.data.saveDefaults() super(MainWindow, self).closeEvent(event)
class MainWindow(QtWidgets.QMainWindow): def __init__(self, context, signals): super(MainWindow, self).__init__() self.signals = signals self.context = context self.resize(800, 480) self.setWindowTitle(self.context.getText("pyqx", "title")) self.statusBar = self.statusBar() self.menuBar = self.createMenuBar() self.toolBar = self.createToolBar() self.createDockWidgets() self.ctrlPressed = False self.mainWidget = MainWidget(context, signals, self) self.setCentralWidget(self.mainWidget) self.imagePosLabel = QtWidgets.QLabel() self.imagePosLabel.setObjectName("ImagePosLabel") self.signals.autoUpdateTool.connect(self.setCurrentTool) self.signals.enterCanvas.connect(self.showImagePosition) self.signals.leaveCanvas.connect(self.hideImagePosition) self.signals.overCanvas.connect(self.setImagePosition) self.show() def createPopupMenu(self): pass # Reimplementando esta función conseguimos que no se creen los menús popup cuando hacemos click derecho en toolbars/dockwidgets. def createToolBarActions(self): l = [] self.tools = QtWidgets.QActionGroup(self) tools = [ "selection", "magicwand", "pencil", "eraser", "colorpicker", "fill", "gradient", "exchange" ] connects = [ lambda: self.context.changeCurrentTool(Pixeler.Tools.Selection), lambda: self.context.changeCurrentTool(Pixeler.Tools.MagicWand), lambda: self.context.changeCurrentTool(Pixeler.Tools.Pencil), lambda: self.context.changeCurrentTool(Pixeler.Tools.Eraser), lambda: self.context.changeCurrentTool(Pixeler.Tools.ColorPicker), lambda: self.context.changeCurrentTool(Pixeler.Tools.Fill), lambda: self.context.changeCurrentTool(Pixeler.Tools.Gradient), lambda: self.context.changeCurrentTool(Pixeler.Tools.Exchange) ] shortcuts = ['Z', '', 'X', 'C', 'A', 'S', 'D', ''] for i in range(len(tools)): a = QtWidgets.QAction( QtGui.QIcon( os.path.join("themes", self.context.theme, tools[i] + ".png")), self.context.getText("tools", tools[i]) + " (" + shortcuts[i] + ")", self.tools) a.setCheckable(True) a.setShortcut(shortcuts[i]) if connects[i] != 0: a.toggled.connect(connects[i]) l.append(a) a = QtWidgets.QAction( QtGui.QIcon( os.path.join("themes", self.context.theme, "zoomin.png")), self.context.getText("tools", "zoomin"), self.tools) a.setShortcut("Ctrl++") a.triggered.connect(self.zoomIn) l.append(a) a = QtWidgets.QAction( QtGui.QIcon( os.path.join("themes", self.context.theme, "zoomout.png")), self.context.getText("tools", "zoomout"), self.tools) a.setShortcut("Ctrl+-") a.triggered.connect(self.zoomOut) l.append(a) l[self.context.currentTool].setChecked(True) return l def createToolBar(self): toolBar = QtWidgets.QToolBar() l = self.createToolBarActions() j = 0 for i in l: toolBar.addAction(i) if j == 7: toolBar.addSeparator() j += 1 toolBar.setMovable(False) toolBar.setOrientation(Qt.Vertical) self.addToolBar(Qt.LeftToolBarArea, toolBar) return toolBar def createFileActions(self): ids = ["new", "open", "save", "saveas", "exit"] icons = [ "document-new.png", "document-open.png", "document-save.png", "document-save-as.png", "application-exit.png" ] shortcuts = ['Ctrl+N', 'Ctrl+O', 'Ctrl+S', 'Ctrl+Shift+S', 'Ctrl+Q'] connects = [ self.newFile, self.openFile, self.saveFile, self.saveFileAs, self.close ] l = [] for i in range(len(ids)): a = QtWidgets.QAction( QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_file_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip( self.context.getText("menu_file_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) l.insert(4, 0) # Los ceros simbolizan separadores return l def createEditActions(self): ids = [ "undo", "redo", "selectall", "deselect", "cut", "copy", "paste", "clear", "preferences" ] icons = [ "edit-undo.png", "edit-redo.png", "", "", "edit-cut.png", "edit-copy.png", "edit-paste.png", "edit-clear.png", "document-properties.png" ] shortcuts = [ 'Ctrl+Z', 'Ctrl+Y', "Ctrl+A", "Ctrl+Shift+A", 'Ctrl+X', 'Ctrl+C', 'Ctrl+V', 'Del', '' ] connects = [ self.undo, self.redo, self.selectAll, self.deselect, self.cut, self.copy, self.paste, self.clear, self.showPreferences ] l = [] for i in range(len(ids)): a = QtWidgets.QAction( QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_edit_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip( self.context.getText("menu_edit_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) # Los ceros simbolizan separadores l.insert(2, 0) l.insert(5, 0) l.insert(10, 0) return l def createViewActions(self): ids = ["pixel_grid", "matrix_grid"] icons = ["", ""] shortcuts = ['Ctrl+G', 'Ctrl+M'] connects = [self.setPixelGrid, self.setMatrixGrid] l = [] for i in range(len(ids)): a = QtWidgets.QAction( QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_view_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip( self.context.getText("menu_view_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) a.setCheckable(True) l.append(a) l.insert(2, 0) # Los ceros simbolizan separadores # Algunas opcionas son chekables, lo consideramos: l[0].setCheckable(True) if self.context.grid: l[0].setChecked(True) l[1].setCheckable(True) if self.context.matrixGrid: l[1].setChecked(True) return l def createTransformActions(self): ids = [ "flip_hor", "flip_ver", "rotate_cw", "rotate_ccw", "rotate_180", "resize", "resize_canvas" ] icons = ["", "", "", "", "", "", ""] shortcuts = ['', '', '', '', '', '', ''] connects = [ self.flipHorizontally, self.flipVertically, self.rotate90CW, self.rotate90CCW, self.rotate180, self.showResizeImageDialog, self.showResizeCanvasDialog ] l = [] for i in range(len(ids)): a = QtWidgets.QAction( QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_transform_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip( self.context.getText("menu_transform_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) # Los ceros simbolizan separadores l.insert(2, 0) l.insert(6, 0) return l def createHelpActions(self): ids = ["contents", "about"] icons = ["help-contents.png", "help-about.png"] shortcuts = ['F1', 'Ctrl+B'] connects = [self.showHelp, self.showAboutDialog] l = [] for i in range(len(ids)): a = QtWidgets.QAction( QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_help_labels", ids[i]), self) a.setShortcut(shortcuts[i]) a.triggered.connect(self.restoreFocus) a.setStatusTip( self.context.getText("menu_help_status_tips", ids[i])) if connects[i] != 0: a.triggered.connect(connects[i]) l.append(a) l.insert(1, 0) # Los ceros simbolizan separadores return l def createMenuBar(self): menubar = self.menuBar() fileMenu = menubar.addMenu(self.context.getText("menu", "file")) editMenu = menubar.addMenu(self.context.getText("menu", "edit")) viewMenu = menubar.addMenu(self.context.getText("menu", "view")) transformMenu = menubar.addMenu( self.context.getText("menu", "transform")) helpMenu = menubar.addMenu(self.context.getText("menu", "help")) fileActions = self.createFileActions() editActions = self.createEditActions() viewActions = self.createViewActions() transformActions = self.createTransformActions() helpActions = self.createHelpActions() for i in fileActions: if i == 0: fileMenu.addSeparator() else: fileMenu.addAction(i) for i in editActions: if i == 0: editMenu.addSeparator() else: editMenu.addAction(i) for i in viewActions: if i == 0: viewMenu.addSeparator() else: viewMenu.addAction(i) for i in helpActions: if i == 0: helpMenu.addSeparator() else: helpMenu.addAction(i) for i in transformActions: if i == 0: transformMenu.addSeparator() else: transformMenu.addAction(i) return menubar def createDockWidgets(self): # Palette widget self.palette = QtWidgets.QDockWidget( self.context.getText("dock_widgets", "palette"), self) self.palette.setAllowedAreas(Qt.RightDockWidgetArea) self.palette.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures) paletteWidget = Palette(self.context, self.signals) self.palette.setWidget(paletteWidget) self.palette.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.addDockWidget(Qt.RightDockWidgetArea, self.palette) # Tool Properties widget self.toolProperties = ToolProperties( self.context.getText("dock_widgets", "tool_properties"), self.context, self.signals) self.addDockWidget(Qt.RightDockWidgetArea, self.toolProperties) self.toolProperties.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) # Preview self.preview = Preview(self.context.getText("dock_widgets", "preview"), self.context, self.signals, self) self.addDockWidget(Qt.RightDockWidgetArea, self.preview) def restoreFocus(self): print("Restoring Focus") self.ctrlPressed = False self.releaseMouse() self.releaseKeyboard() QtCore.QCoreApplication.instance().restoreOverrideCursor() def setCurrentTool(self, index): self.tools.actions()[0].setChecked(True) self.signals.updateTool.emit(0) def zoomIn(self): if self.context.currentImage().zoom < 25: self.context.currentImage().zoom += 1 self.signals.zoom.emit() def zoomOut(self): if self.context.currentImage().zoom > 1: self.context.currentImage().zoom -= 1 self.signals.zoom.emit() def newFile(self): d = NewFileDialog(self.context, self) def openFile(self): fileName = QtWidgets.QFileDialog.getOpenFileName( self, self.context.getText("dialog_open", "title"), "/home", self.context.getText("dialog_open", "images") + u" (*.bmp *.gif *.png *.xpm *.jpg);;" + self.context.getText("dialog_open", "all_files") + u" (*)") if fileName: self.context.loadImage(fileName) def saveFile(self): if self.context.currentImage().fileName == "": self.saveFileAs() else: self.context.currentImage().save() def saveFileAs(self): d = QtWidgets.QFileDialog() fileName, filterName = d.getSaveFileName( self, self.context.getText("dialog_save", "title"), "", "*.bmp;;*.gif;;*.png;;*.xpm;;*.jpg") if fileName.split(".")[-1] in ["bmp", "gif", "png", "xpm", "jpg"]: self.context.currentImage().fileName = fileName self.signals.fileNameChanged.emit( self.context.getCurrentImagePos(), os.path.basename(str(fileName))) else: self.context.currentImage().fileName = fileName + filterName[1:] self.signals.fileNameChanged.emit( self.context.getCurrentImagePos(), os.path.basename(str(fileName + filterName[1:]))) self.context.currentImage().save() def close(self): pass def undo(self): if self.context.currentImage().posHistory > 0: self.context.currentImage().posHistory -= 1 self.context.currentImage().image = QtWidgets.QImage( self.context.currentImage().history[ self.context.currentImage().posHistory]) self.signals.updateCanvas.emit() self.signals.resizeCanvas.emit() def redo(self): if self.context.currentImage().posHistory < len( self.context.currentImage().history) - 1: self.context.currentImage().posHistory += 1 self.context.currentImage().image = QtWidgets.QImage( self.context.currentImage().history[ self.context.currentImage().posHistory]) self.signals.updateCanvas.emit() self.signals.resizeCanvas.emit() def selectAll(self): self.mainWidget.currentWidget().canvas.selectAll() def deselect(self): self.mainWidget.currentWidget().canvas.applySelection() def cut(self): self.signals.cutImage.emit() def copy(self): self.signals.copyImage.emit() def paste(self): clipboard = QtWidgets.QApplication.clipboard() if not clipboard.image().isNull(): self.signals.pasteImage.emit() self.signals.updateCanvas.emit() def clear(self): self.signals.clearImage.emit() def showPreferences(self): d = Preferences(self.context, self.signals, self) def setPixelGrid(self): self.context.grid = not self.context.grid self.signals.updateCanvas.emit() self.context.setDefault("grid", "grid", self.context.grid) def setMatrixGrid(self): self.context.matrixGrid = not self.context.matrixGrid self.signals.updateCanvas.emit() self.context.setDefault("grid", "matrix_grid", self.context.matrixGrid) def flipHorizontally(self): pass def flipVertically(self): pass def rotate90CW(self): pass def rotate90CCW(self): pass def rotate180(self): pass def showResizeImageDialog(self): pass def showResizeCanvasDialog(self): pass def showHelp(self): pass def showAboutDialog(self): pass def showImagePosition(self): if self.imagePosLabel.isHidden(): self.statusBar.insertWidget(0, self.imagePosLabel, 0) self.imagePosLabel.show() def hideImagePosition(self): self.statusBar.removeWidget(self.imagePosLabel) def setImagePosition(self, x, y): self.imagePosLabel.setText(" Pos: (" + str(x) + ", " + str(y) + ")") def keyPressEvent(self, event): super(MainWindow, self).keyPressEvent(event) if event.key() == Qt.Key_Control: print("Control Pressed") self.ctrlPressed = True QtCore.QCoreApplication.instance().setOverrideCursor( self.context.colorPickerCur) self.signals.ctrlPressed.emit() self.grabMouse() self.grabKeyboard() elif event.key() == Qt.Key_Plus: if self.context.currentTool == 1: self.context.setPencilSize(self.context.pencilSize + 1) elif self.context.currentTool == 2: self.context.setEraserSize(self.context.eraserSize + 1) elif event.key() == Qt.Key_Minus: if self.context.currentTool == 1: self.context.setPencilSize(self.context.pencilSize - 1) elif self.context.currentTool == 2: self.context.setEraserSize(self.context.eraserSize - 1) else: QtCore.QCoreApplication.instance().restoreOverrideCursor() self.releaseMouse() self.releaseKeyboard() def keyReleaseEvent(self, event): super(MainWindow, self).keyReleaseEvent(event) if event.key() == Qt.Key_Control: self.ctrlPressed = False QtCore.QCoreApplication.instance().restoreOverrideCursor() self.releaseMouse() self.releaseKeyboard() def mousePressEvent(self, event): super(MainWindow, self).mousePressEvent(event) if self.ctrlPressed: print("Picking Desktop Color") widget = QtCore.QCoreApplication.instance().desktop().screen() im = QtWidgets.QPixmap.grabWindow( widget.winId()).toImage() # Captura de pantalla c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos( ))) # Cogemos el color de la posición del cursor if event.button() == Qt.LeftButton: self.context.changePrimaryColor( c ) # Cambiamos el color primario actual por el que hemos cogido elif event.button() == Qt.RightButton: self.context.changeSecondaryColor( c ) # Cambiamos el color secundario actual por el que hemos cogido # im.save("desktop.png") # Guardar la captura de pantalla en un archivo # print "Getting color " + c.red(), c.green(), c.blue() + " from screen" # Comprueba qué color coge def mouseMoveEvent(self, event): super(MainWindow, self).mouseMoveEvent(event) # Lo mismo de antes pero para cuando el ratón se mueve if self.ctrlPressed: widget = QtCore.QCoreApplication.instance().desktop().screen() im = QtWidgets.QPixmap.grabWindow( widget.winId()).toImage() # Captura de pantalla c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos( ))) # Cogemos el color de la posición del cursor if event.buttons() == Qt.LeftButton: self.context.changePrimaryColor( c ) # Cambiamos el color primario actual por el que hemos cogido elif event.buttons() == Qt.RightButton: self.context.changeSecondaryColor( c ) # Cambiamos el color secundario actual por el que hemos cogido def wheelEvent(self, event): if self.ctrlPressed: if event.delta() > 0: self.zoomIn() else: self.zoomOut() super(MainWindow, self).wheelEvent(event) def closeEvent(self, event): l = [] for i in range(len(self.context.images)): if self.context.images[i].modified: l.append(i) if len(l) > 0: # Mostrar diálogo reply = QtWidgets.QMessageBox.warning( self, self.context.getText("dialog_exit", "title"), self.context.getText("dialog_exit", "message"), QtWidgets.QMessageBox.SaveAll | QtWidgets.QMessageBox.Discard | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel) if reply == QtWidgets.QMessageBox.Discard: event.accept() elif reply == QtWidgets.QMessageBox.Cancel: event.ignore() return elif reply == QtWidgets.QMessageBox.SaveAll: for i in l: self.mainWidget.setCurrentIndex(i) self.context.setCurrentImagePos(i) self.saveFile() event.accept() return self.context.saveDefaults() super(MainWindow, self).closeEvent(event)
# -*- coding: utf-8 -*- from PyQt5.QtWidgets import QApplication, QToolTip from PyQt5.QtGui import QFont from globalvalue import setMainWidget, DefaultFontList, DefaultFontSize, DefaultFontSizeForToolTip from mainwidget import MainWidget import sys from localelanguage import initLocale if __name__ == '__main__': #init locale initLocale() app = QApplication(sys.argv) #Try to init font with default font list for fontName in DefaultFontList: font = QFont(fontName, DefaultFontSize) if font.exactMatch(): app.setFont(font) tipFont = QFont(fontName, DefaultFontSizeForToolTip) QToolTip.setFont(tipFont) break mainWidget = MainWidget() setMainWidget(mainWidget) sys.exit(app.exec_())