diff options
Diffstat (limited to 'examples/widgets/mainwindows/application/application.py')
-rwxr-xr-x | examples/widgets/mainwindows/application/application.py | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/examples/widgets/mainwindows/application/application.py b/examples/widgets/mainwindows/application/application.py new file mode 100755 index 000000000..f1f2ca7c2 --- /dev/null +++ b/examples/widgets/mainwindows/application/application.py @@ -0,0 +1,273 @@ +#!/usr/bin/env python + +############################################################################# +## +## Copyright (C) 2013 Riverbank Computing Limited. +## Copyright (C) 2016 The Qt Company Ltd. +## Contact: http://www.qt.io/licensing/ +## +## This file is part of the PySide examples of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:BSD$ +## You may use this file under the terms of the BSD license as follows: +## +## "Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are +## met: +## * Redistributions of source code must retain the above copyright +## notice, this list of conditions and the following disclaimer. +## * Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in +## the documentation and/or other materials provided with the +## distribution. +## * Neither the name of The Qt Company Ltd nor the names of its +## contributors may be used to endorse or promote products derived +## from this software without specific prior written permission. +## +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +## +## $QT_END_LICENSE$ +## +############################################################################# + +from PySide2 import QtCore, QtGui, QtWidgets + +import application_rc + +class MainWindow(QtWidgets.QMainWindow): + def __init__(self): + super(MainWindow, self).__init__() + + self.curFile = '' + + self.textEdit = QtWidgets.QTextEdit() + self.setCentralWidget(self.textEdit) + + self.createActions() + self.createMenus() + self.createToolBars() + self.createStatusBar() + + self.readSettings() + + self.textEdit.document().contentsChanged.connect(self.documentWasModified) + + self.setCurrentFile('') + self.setUnifiedTitleAndToolBarOnMac(True) + + def closeEvent(self, event): + if self.maybeSave(): + self.writeSettings() + event.accept() + else: + event.ignore() + + def newFile(self): + if self.maybeSave(): + self.textEdit.clear() + self.setCurrentFile('') + + def open(self): + if self.maybeSave(): + fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self) + if fileName: + self.loadFile(fileName) + + def save(self): + if self.curFile: + return self.saveFile(self.curFile) + + return self.saveAs() + + def saveAs(self): + fileName, filtr = QtWidgets.QFileDialog.getSaveFileName(self) + if fileName: + return self.saveFile(fileName) + + return False + + def about(self): + QtWidgets.QMessageBox.about(self, "About Application", + "The <b>Application</b> example demonstrates how to write " + "modern GUI applications using Qt, with a menu bar, " + "toolbars, and a status bar.") + + def documentWasModified(self): + self.setWindowModified(self.textEdit.document().isModified()) + + def createActions(self): + self.newAct = QtWidgets.QAction(QtGui.QIcon(':/images/new.png'), "&New", + self, shortcut=QtGui.QKeySequence.New, + statusTip="Create a new file", triggered=self.newFile) + + self.openAct = QtWidgets.QAction(QtGui.QIcon(':/images/open.png'), + "&Open...", self, shortcut=QtGui.QKeySequence.Open, + statusTip="Open an existing file", triggered=self.open) + + self.saveAct = QtWidgets.QAction(QtGui.QIcon(':/images/save.png'), + "&Save", self, shortcut=QtGui.QKeySequence.Save, + statusTip="Save the document to disk", triggered=self.save) + + self.saveAsAct = QtWidgets.QAction("Save &As...", self, + shortcut=QtGui.QKeySequence.SaveAs, + statusTip="Save the document under a new name", + triggered=self.saveAs) + + self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q", + statusTip="Exit the application", triggered=self.close) + + self.cutAct = QtWidgets.QAction(QtGui.QIcon(':/images/cut.png'), "Cu&t", + self, shortcut=QtGui.QKeySequence.Cut, + statusTip="Cut the current selection's contents to the clipboard", + triggered=self.textEdit.cut) + + self.copyAct = QtWidgets.QAction(QtGui.QIcon(':/images/copy.png'), + "&Copy", self, shortcut=QtGui.QKeySequence.Copy, + statusTip="Copy the current selection's contents to the clipboard", + triggered=self.textEdit.copy) + + self.pasteAct = QtWidgets.QAction(QtGui.QIcon(':/images/paste.png'), + "&Paste", self, shortcut=QtGui.QKeySequence.Paste, + statusTip="Paste the clipboard's contents into the current selection", + triggered=self.textEdit.paste) + + self.aboutAct = QtWidgets.QAction("&About", self, + statusTip="Show the application's About box", + triggered=self.about) + + self.aboutQtAct = QtWidgets.QAction("About &Qt", self, + statusTip="Show the Qt library's About box", + triggered=QtWidgets.qApp.aboutQt) + + self.cutAct.setEnabled(False) + self.copyAct.setEnabled(False) + self.textEdit.copyAvailable.connect(self.cutAct.setEnabled) + self.textEdit.copyAvailable.connect(self.copyAct.setEnabled) + + def createMenus(self): + self.fileMenu = self.menuBar().addMenu("&File") + self.fileMenu.addAction(self.newAct) + self.fileMenu.addAction(self.openAct) + self.fileMenu.addAction(self.saveAct) + self.fileMenu.addAction(self.saveAsAct) + self.fileMenu.addSeparator(); + self.fileMenu.addAction(self.exitAct) + + self.editMenu = self.menuBar().addMenu("&Edit") + self.editMenu.addAction(self.cutAct) + self.editMenu.addAction(self.copyAct) + self.editMenu.addAction(self.pasteAct) + + self.menuBar().addSeparator() + + self.helpMenu = self.menuBar().addMenu("&Help") + self.helpMenu.addAction(self.aboutAct) + self.helpMenu.addAction(self.aboutQtAct) + + def createToolBars(self): + self.fileToolBar = self.addToolBar("File") + self.fileToolBar.addAction(self.newAct) + self.fileToolBar.addAction(self.openAct) + self.fileToolBar.addAction(self.saveAct) + + self.editToolBar = self.addToolBar("Edit") + self.editToolBar.addAction(self.cutAct) + self.editToolBar.addAction(self.copyAct) + self.editToolBar.addAction(self.pasteAct) + + def createStatusBar(self): + self.statusBar().showMessage("Ready") + + def readSettings(self): + settings = QtCore.QSettings("Trolltech", "Application Example") + pos = settings.value("pos", QtCore.QPoint(200, 200)) + size = settings.value("size", QtCore.QSize(400, 400)) + self.resize(size) + self.move(pos) + + def writeSettings(self): + settings = QtCore.QSettings("Trolltech", "Application Example") + settings.setValue("pos", self.pos()) + settings.setValue("size", self.size()) + + def maybeSave(self): + if self.textEdit.document().isModified(): + ret = QtWidgets.QMessageBox.warning(self, "Application", + "The document has been modified.\nDo you want to save " + "your changes?", + QtWidgets.QMessageBox.Save | QtWidgets.QMessageBox.Discard | + QtWidgets.QMessageBox.Cancel) + if ret == QtWidgets.QMessageBox.Save: + return self.save() + elif ret == QtWidgets.QMessageBox.Cancel: + return False + return True + + def loadFile(self, fileName): + file = QtCore.QFile(fileName) + if not file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text): + QtWidgets.QMessageBox.warning(self, "Application", + "Cannot read file %s:\n%s." % (fileName, file.errorString())) + return + + inf = QtCore.QTextStream(file) + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) + self.textEdit.setPlainText(inf.readAll()) + QtWidgets.QApplication.restoreOverrideCursor() + + self.setCurrentFile(fileName) + self.statusBar().showMessage("File loaded", 2000) + + def saveFile(self, fileName): + file = QtCore.QFile(fileName) + if not file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text): + QtWidgets.QMessageBox.warning(self, "Application", + "Cannot write file %s:\n%s." % (fileName, file.errorString())) + return False + + outf = QtCore.QTextStream(file) + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) + + # FIXME: Once file is out of scope, the file is empty, instead of having text. + outf << self.textEdit.toPlainText() + QtWidgets.QApplication.restoreOverrideCursor() + + self.setCurrentFile(fileName); + self.statusBar().showMessage("File saved", 2000) + return True + + def setCurrentFile(self, fileName): + self.curFile = fileName + self.textEdit.document().setModified(False) + self.setWindowModified(False) + + if self.curFile: + shownName = self.strippedName(self.curFile) + else: + shownName = 'untitled.txt' + + self.setWindowTitle("%s[*] - Application" % shownName) + + def strippedName(self, fullFileName): + return QtCore.QFileInfo(fullFileName).fileName() + + +if __name__ == '__main__': + + import sys + + app = QtWidgets.QApplication(sys.argv) + mainWin = MainWindow() + mainWin.show() + sys.exit(app.exec_()) |