コード例 #1
0
    def __init__(self, controller):
        """Set up the main window and initialise widgets.
        Args:
            controller: A route controller.
        """
        super().__init__()
        self._ct = controller
        self._widgets = {}
        self._ui = Ui_MainWindow()
        self._ui.setupUi(self)
        self._ui.about_action.triggered.connect(self.aboutInfo)
        self._ui.file_load_action.triggered.connect(self.fileLoadPrompt)
        self._ui.exit_btn.clicked.connect(self.close)
        self._ui.download_btn.clicked.connect(controller.downloadAction)
        self._ui.download_action.triggered.connect(controller.downloadAction)

        self._ct.register(self.startRouteSelect, "LOADED")
        self._ct.register(self.displayError, "ERROR")
コード例 #2
0
ファイル: MainWindow.py プロジェクト: gaozhidf/pyqt
 def __init__(self, parent=None):
     super(MainWindow, self).__init__(parent)
     self.ui = Ui_MainWindow()
     self.ui.setupUi(self)
     
     # initialize ui
     self.initUI()
     
     # no frame window
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
コード例 #3
0
ファイル: MainWindow.py プロジェクト: gaozhidf/pyqt
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        # initialize ui
        self.initUI()
        
        # no frame window
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

    def initUI(self):
        self.ui.lineEdit.textEdited[str].connect(self.updateLabelText)
        self.ui.pushButton.clicked.connect(self.buttonClick)
        
        #resize window when no frame window
        self.ui.verticalLayoutRight.addWidget(QtGui.QSizeGrip(self), 0, QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)

    def buttonClick(self):
        QtGui.QMessageBox.about(self, 'title', 'content')

    def updateLabelText(self, text):
        self.ui.label.setText(text)
        
    #add for window movable
    def mousePressEvent(self, event):
        """ override mouse press event """
        self._postion = event.globalPos() - self.pos()

    def mouseMoveEvent(self, event):
        """ override mouse move event """
        self.move(event.globalPos() - self._postion)

    def closeEvent(self, event):
        """ override close event """
        event.accept()
コード例 #4
0
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.scene_org = QGraphicsScene()
        self.scene_reduced = QGraphicsScene()
        self.scene_template = QGraphicsScene()
        self.ui.graphicsViewOriginal.setScene(self.scene_org)

        self.controller = None

        self.computation_started = False

        # slots
        self.resized.connect(self.resize_image)
        self.ui.tabWidget.currentChanged.connect(self.resize_image)

        self.ui.toolButtonOpenPhoto.clicked.connect(self.__select_image)
        self.ui.pushButtonStart.clicked.connect(self.__start_computation)

        self.ui.pushButtonExport.clicked.connect(self.__export)

        self.installEventFilter(self)
コード例 #5
0
class MainWindow(Qw.QMainWindow):
    """Primary view class for TrekApp.
    MainWindow instantiates widgets for each 'screen' in the app.
    Screens are drawn inside the main window.
    """
    def __init__(self, controller):
        """Set up the main window and initialise widgets.
        Args:
            controller: A route controller.
        """
        super().__init__()
        self._ct = controller
        self._widgets = {}
        self._ui = Ui_MainWindow()
        self._ui.setupUi(self)
        self._ui.about_action.triggered.connect(self.aboutInfo)
        self._ui.file_load_action.triggered.connect(self.fileLoadPrompt)
        self._ui.exit_btn.clicked.connect(self.close)
        self._ui.download_btn.clicked.connect(controller.downloadAction)
        self._ui.download_action.triggered.connect(controller.downloadAction)

        self._ct.register(self.startRouteSelect, "LOADED")
        self._ct.register(self.displayError, "ERROR")

    @pyqtSlot()
    def fileLoadPrompt(self):
        """Ask user to select a file, then pass the filename to controller."""
        filename, _ = Qw.QFileDialog.getOpenFileName(self, 'Route file', '/')
        if filename:
            self._ct.fileLoadAction(filename)

    @pyqtSlot()
    def aboutInfo(self):
        """Display a message with information about the program."""
        msg = "Hello, and welcome to my assignment!\n"\
              "For more information, please see readme.md in the main program "\
              "directory."
        Qw.QMessageBox.information(self, "About", msg)

    def startRouteSelect(self, route_collection):
        """Create and open the route selection screen.
        If route screen existed previously, it is destroyed.
        """
        stack = self._ui.screen_stack
        if "RouteSelectScreen" in self._widgets:
            stack.removeWidget(self._widgets["RouteSelectScreen"])
        screen = RouteSelectScreen(self, self._ct)
        self._widgets["RouteSelectScreen"] = screen
        stack.addWidget(screen)
        screen.routeSelected.connect(self.startTracking)
        stack.setCurrentWidget(self._widgets["RouteSelectScreen"])

    @pyqtSlot()
    def displayRouteSelect(self):
        """Called when a user finishes tracking a route."""
        self._ui.screen_stack.setCurrentWidget(
            self._widgets["RouteSelectScreen"])

    @pyqtSlot(str)
    def startTracking(self, route_name):
        """Create and open a tracking screen for the given route.
        If previously opened, destroy the original screen."""
        controller = self._ct.startNavigation(route_name)
        if not controller:
            self.displayError(
                "Something went wrong while accessing the route :(")
        else:
            if "TrackingScreen" in self._widgets:
                self._ui.screen_stack.removeWidget(
                    self._widgets["TrackingScreen"])
            screen = TrackingScreen(self, controller)
            screen.exitTracking.connect(self.displayRouteSelect)
            self._widgets["TrackingScreen"] = screen
            self._ui.screen_stack.addWidget(screen)
            self._ui.screen_stack.setCurrentWidget(screen)

    def closeEvent(self, event):
        """Handle a request to close the app with a confirmation prompt."""
        reply = Qw.QMessageBox.question(self, "Exit", "Really exit?",
                                        Qw.QMessageBox.Yes | Qw.QMessageBox.No,
                                        Qw.QMessageBox.No)
        if reply == Qw.QMessageBox.Yes:
            Qw.QApplication.instance().quit()
        else:
            event.ignore()

    @pyqtSlot(str)
    def displayError(self, message):
        """Print an error message to the user in a popup message box.
        Args:
            message: Full content of the error message to display.
        """
        msg = Qw.QMessageBox()
        msg.setText(message)
        msg.exec_()
コード例 #6
0
class MainWindow(QMainWindow, Observer):
    resized = Signal()

    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.scene_org = QGraphicsScene()
        self.scene_reduced = QGraphicsScene()
        self.scene_template = QGraphicsScene()
        self.ui.graphicsViewOriginal.setScene(self.scene_org)

        self.controller = None

        self.computation_started = False

        # slots
        self.resized.connect(self.resize_image)
        self.ui.tabWidget.currentChanged.connect(self.resize_image)

        self.ui.toolButtonOpenPhoto.clicked.connect(self.__select_image)
        self.ui.pushButtonStart.clicked.connect(self.__start_computation)

        self.ui.pushButtonExport.clicked.connect(self.__export)

        self.installEventFilter(self)

    def eventFilter(self, widget, event):
        if event.type() == QEvent.KeyPress:
            key = event.key()
            if key == Qt.Key_Return and not self.computation_started:
                self.__start_computation()
            elif key == Qt.Key_Enter and not self.computation_started:
                self.__start_computation()
            return True
        return QWidget.eventFilter(self, widget, event)

    def set_controller(self, controller):
        self.controller = controller

    def __select_image(self):
        file_dialog = QFileDialog()
        MainWindow.__set_file_dialog_options(
            file_dialog,
            get_config().getboolean('UI', 'NO_NATIVE_DIALOG'))

        path = file_dialog.getOpenFileName(
            self, 'Open File', " ../../", 'Images (*.png *.svg *.jpg *.jpeg)',
            '')[0]
        if path:
            self.controller.open_image(path)
            self.ui.tabWidget.setCurrentIndex(0)
            self.resize_image()

    @staticmethod
    def __set_file_dialog_options(file_dialog, is_not_native_dialog):
        file_dialog.setOption(QFileDialog.DontUseNativeDialog,
                              is_not_native_dialog)

    def __start_computation(self):
        if self.controller:
            self.__disable_ui(True)
            self.__set_computation_text()

            worker = ComputeCanvasWorker(
                self.ui.spinBoxNumberOfColors.value(),
                self.ui.comboBoxPrintSize.currentText(),
                self.ui.spinBoxMinSurfaceSize.value(),
                self.ui.checkBox.isChecked(), self.controller)  # no parent!
            self.controller.register_observer(worker)
            self.thread = QThread()
            worker.moveToThread(self.thread)
            worker.finished.connect(self.thread.quit)
            self.thread.started.connect(worker.run)
            self.thread.start()

    def __export(self):

        file_name = self.open_save_file_dialog(
        ) if self.controller.canvas else ""
        self.controller.export(self.ui.comboBoxPrintSize.currentText(),
                               file_name=file_name)

    def display_image(self, img_data):
        self.__clear_scenes()
        self.__add_image_to_scene(self.scene_org, img_data[0])

        if img_data[1]:
            self.__add_image_to_scene(self.scene_reduced, img_data[1])
            self.__add_image_to_scene(self.scene_template, img_data[2])
            self.ui.tabWidget.setCurrentIndex(1)

    def __set_computation_text(self):
        self.scene_org = QGraphicsScene()
        self.scene_org.addText("It'll take a moment.")
        self.ui.graphicsViewOriginal.setScene(self.scene_org)
        self.ui.tabWidget.setCurrentIndex(0)
        self.computation_started = True
        self.resize_image()

    def __clear_scenes(self):
        self.scene_org = QGraphicsScene()
        self.scene_reduced = QGraphicsScene()
        self.scene_template = QGraphicsScene()
        self.ui.graphicsViewOriginal.setScene(self.scene_org)
        self.ui.graphicsViewReducedColors.setScene(self.scene_reduced)
        self.ui.graphicsViewTemplate.setScene(self.scene_template)

    def __disable_ui(self, boolean):
        self.ui.pushButtonStart.setDisabled(boolean)
        self.ui.pushButtonExport.setDisabled(boolean)
        self.ui.toolButtonOpenPhoto.setDisabled(boolean)
        self.ui.spinBoxNumberOfColors.setDisabled(boolean)
        self.ui.spinBoxMinSurfaceSize.setDisabled(boolean)
        self.ui.comboBoxPrintSize.setDisabled(boolean)
        self.ui.checkBox.setDisabled(boolean)
        self.ui.tabWidget.setDisabled(boolean)

    def __add_image_to_scene(self, scene, image):
        pixmap = self.__pil_to_pixmap(image)
        scene.addPixmap(pixmap)

    @staticmethod
    def __pil_to_pixmap(img):
        if img.mode == "RGB":
            pass
        elif img.mode == "L":
            img = img.convert("RGBA")
        data = img.convert("RGBA").tobytes("raw", "BGRA")
        qim = QImage(data, img.size[0], img.size[1], QImage.Format_ARGB32)
        pixmap = QPixmap.fromImage(qim)
        return pixmap

    def resizeEvent(self, event):
        self.resized.emit()
        return super(MainWindow, self).resizeEvent(event)

    def resize_image(self):
        if self.controller:
            if self.computation_started:
                self.ui.graphicsViewOriginal.fitInView(
                    QRectF(0, 0, self.scene_org.width(),
                           self.scene_org.height()), Qt.KeepAspectRatio)
            else:
                self.ui.graphicsViewOriginal.fitInView(
                    QRectF(0, 0,
                           self.controller.get_image_size()[0],
                           self.controller.get_image_size()[1]),
                    Qt.KeepAspectRatio)
                self.ui.graphicsViewReducedColors.fitInView(
                    QRectF(0, 0,
                           self.controller.get_image_size()[0],
                           self.controller.get_image_size()[1]),
                    Qt.KeepAspectRatio)
                self.ui.graphicsViewTemplate.fitInView(
                    QRectF(0, 0,
                           self.controller.get_image_size()[0],
                           self.controller.get_image_size()[1]),
                    Qt.KeepAspectRatio)

    def open_save_file_dialog(self):
        file_dialog = QFileDialog()
        file_name = file_dialog.getSaveFileName(self, 'Save as PDF', " ../../",
                                                'PDF (*.pdf)', '')[0]

        return file_name

    @staticmethod
    def show_message(text):
        msgBox = QMessageBox()
        msgBox.setText(text)
        msgBox.exec_()

    def notify(self, update_data):
        self.computation_started = False
        self.__disable_ui(False)
        if isinstance(update_data, str):
            self.show_message(update_data)
        else:
            self.display_image(update_data)