示例#1
0
class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self._initUI()

    def _initUI(self):
        self.setContentsMargins(10, 10, 10, 10)

        self.statusBar = QStatusBar(self)
        self.setStatusBar(self.statusBar)

        self.statusBar.showMessage("5초뒤 없어짐", 5000)

        group_box = QGroupBox('상태바')
        btn1 = QPushButton('상태바 보이기', self)
        btn2 = QPushButton('상태바 감추기', self)
        btn3 = QPushButton('상태바 텍스트 가져오기', self)
        btn4 = QPushButton('상태바 텍스트 변경하기', self)

        btn1.clicked.connect(self.onMyStatusBarShow)
        btn2.clicked.connect(self.onMyStatusBarHide)
        btn3.clicked.connect(self.onMyStatusBarGetText)
        btn4.clicked.connect(self.onMyStatusBarChangeText)

        v_box = QVBoxLayout()
        v_box.addWidget(btn1)
        v_box.addWidget(btn2)
        v_box.addWidget(btn3)
        v_box.addWidget(btn4)
        group_box.setLayout(v_box)

        self.setCentralWidget(group_box)

        self.setWindowTitle('Status Bar')
        self.setGeometry(300, 300, 300, 200)
        self.show()

    def onMyStatusBarShow(self):
        self.statusBar.showMessage('Ready')

    def onMyStatusBarHide(self):
        self.statusBar.clearMessage()

    def onMyStatusBarGetText(self):
        getMessage = self.statusBar.currentMessage()
        print(getMessage)

    def onMyStatusBarChangeText(self):
        self.statusBar.showMessage("change")
示例#2
0
class Window(QMainWindow):
    def __init__(self, w, h, parent=None, fn=None):
        # Inheritance
        super().__init__(parent)

        # Basic parameters
        self.name = ''

        # Style parameters
        self.font_size = conf['default-font-size']
        self.font = 'font-size: ' + str(conf['default-font-size'])
        self.background_color = 'background-color: ' + conf['background-color']
        self.font_color = 'color: ' + conf['font-color']
        self.font_family = ''
        self.style = ''

        self._autosaveText = 'Enable autosave'
        self._autosave = False

        self.encoding = 'utf-8'

        # Main widgets
        self._editBox = QTextEdit()
        self.about_window = About(w * 0.5, h * 0.5)
        self._fileDialog = QFileDialog()
        self._encodingDialog = encodingDialog(self)
        self.closing_with_text = QMessageBox(
            QMessageBox.Warning, 'Unsaved text. Still close?',
            'There is text not saved in the editor.\n' +
            'Do you still want to close the editor?')
        self.closing_with_text.setStandardButtons(QMessageBox.Ok
                                                  | QMessageBox.Cancel)

        # Setting edit box main properties
        self.setCentralWidget(self._editBox)
        self.resize(int(w), int(h))
        self.setFocusPolicy(QtCore.Qt.StrongFocus)
        self._editBox.setFocusPolicy(QtCore.Qt.StrongFocus)
        self._editBox.setAcceptRichText(False)  # Erase format when pasting

        # Timer for the autosave
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.save)

        # Shortcuts (https://zetcode.com/pyqt/qshortcut/)
        self.ctrlsave = QShortcut(QKeySequence('Ctrl+S'), self)
        self.ctrlsave.activated.connect(self.save)
        self.quitSc = QShortcut(QKeySequence('Ctrl+Q'), self)
        self.quitSc.activated.connect(QApplication.instance().quit)

        # Initial functions
        if fn != None:
            self.openGiven(fn)
        self.updateStyle()
        self.setWindowTitle('Dark Theme Text Editor')
        self._createMenu()
        self._createToolBar()
        self._createStatusBar()

    def _createMenu(self):
        self.menu = self.menuBar().addMenu("&Menu")
        self.menu.addAction('&Open file', self.openFile)
        self.menu.addAction('&Save copy as', self.save_as)
        self.menu.addAction('&Change encoding', self.changeEncoding)
        self.menu.addAction('&About', self.about)
        self.menu.addAction('&Exit', self.close)
        self.options = self.menuBar().addMenu("&Options")
        self.options.addAction('&Font', self.fontMenu)

    def _createToolBar(self):
        tools = QToolBar()
        self.addToolBar(tools)
        tools.addAction('Save', self.save)
        tools.addAction('Exit', self.close)
        self.saveAction = tools.addAction(self._autosaveText, self.autosave)

    def _createStatusBar(self):
        self.status = QStatusBar()
        self.status.showMessage('New file {:>}'.format('Encoding: ' +
                                                       self.encoding))
        self.setStatusBar(self.status)

    def about(self):
        self.about_window.show()

    def updateStatusBar(self, text):
        self.status.showMessage(text)
        self.setStatusBar(self.status)

    # SAVE METHODS
    def saveFile(self):
        file = open(self.name, 'wb')
        text = (self._editBox.toPlainText()).encode(self.encoding)
        file.write(text)
        file.close()

    def save(self, bypass=False):
        if self.name != '':
            self.save_update()
        else:
            self.name = self._fileDialog.getSaveFileName(self)[0]
            if self.name != '':
                self.save_update()
            else:
                self.updateStatusBar('Unsaved file')

    def save_update(self):
        self.saveFile()
        self.updateStatusBar("{:50}{:^9}Last saved: {}".format(
            self.name, '|', dt.datetime.today()))

    def save_as(self):
        self.save(bypass=True)

    def autosave(self):
        if self._autosave:
            self._autosaveText = 'Enable autosave'
            self._autosave = True
            self.timer.stop()
        else:
            self._autosaveText = 'Disable autosave'
            self._autosave = False
            self.timer.start(1000)
        self.saveAction.setText(self._autosaveText)

    # STYLE METHODS
    def changeFontSize(self, size):
        self.font = 'font-size:{}px'.format(int(size))
        self.updateStyle()

    def fontMenu(self):
        font, valid = QFontDialog.getFont()
        if valid:
            self.font_family = 'font-family:"{}";'.format(font)
        self.updateStyle()

    def updateStyle(self):
        self.style = ''
        self.style += self.font + ';'
        self.style += self.background_color + ';'
        self.style += self.font_color + ';'
        self.style += self.font_family + ';'
        self.setStyleSheet(self.style)

    # OTHER METHODS
    def openGiven(self, given):
        self.name = given
        with open(self.name, 'rb') as fn:
            self._editBox.setText(fn.read().decode(self.encoding))

    def openFile(self):
        try:
            self.openGiven(QFileDialog.getOpenFileName(self, 'Open file')[0])
        except:
            QMessageBox.information(
                self, 'Wrong encoding',
                ('In case you see a weird behaivour' +
                 'with the text displayed.\n' + 'Please check what is the' +
                 'encoding of you file and set it on ' +
                 'the application correspondinly.'))
            with open(self.name, 'r') as fn:
                self._editBox.setText(fn.read())
        self.save()

    def changeEncoding(self):
        retval = self._encodingDialog.getItem()
        self.encoding = retval
        self.updateStatusBar("{} | {:>}".format(self.status.currentMessage(),
                                                'Encoding: ' + self.encoding))
        print(retval)

    def wheelEvent(self, event):
        self.font_size += event.angleDelta().y() / 280
        self.changeFontSize(self.font_size)

    # Handling close event
    def closeEvent(self, event):
        print("User has clicked the red x on the main window")
        if self._editBox.toPlainText() == '':
            retval = self.closing_with_text.exec_()
            if retval == QMessageBox.Ok:
                print('Ok pressed')
                event.accept()
            else:
                print('Cancel pressed')
                event.ignore()