#!/usr/bin/env python import sys from PyQt4 import QtCore, QtGui import application_rc class MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.curFile = QtCore.QString() self.textEdit = QtGui.QTextEdit() self.setCentralWidget(self.textEdit) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.readSettings() self.connect(self.textEdit.document(), QtCore.SIGNAL("contentsChanged()"), self.documentWasModified) self.setCurrentFile(QtCore.QString()) 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(QtCore.QString()) def open(self): if self.maybeSave(): fileName = QtGui.QFileDialog.getOpenFileName(self) if not fileName.isEmpty(): self.loadFile(fileName) def save(self): if self.curFile.isEmpty(): return self.saveAs() else: return self.saveFile(self.curFile) def saveAs(self): fileName = QtGui.QFileDialog.getSaveFileName(self) if fileName.isEmpty(): return False return self.saveFile(fileName) def about(self): QtGui.QMessageBox.about(self, self.tr("About Application"), self.tr("The Application 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 = QtGui.QAction(QtGui.QIcon(":/images/new.png"), self.tr("&New"), self) self.newAct.setShortcut(self.tr("Ctrl+N")) self.newAct.setStatusTip(self.tr("Create a new file")) self.connect(self.newAct, QtCore.SIGNAL("triggered()"), self.newFile) self.openAct = QtGui.QAction(QtGui.QIcon(":/images/open.png"), self.tr("&Open..."), self) self.openAct.setShortcut(self.tr("Ctrl+O")) self.openAct.setStatusTip(self.tr("Open an existing file")) self.connect(self.openAct, QtCore.SIGNAL("triggered()"), self.open) self.saveAct = QtGui.QAction(QtGui.QIcon(":/images/save.png"), self.tr("&Save"), self) self.saveAct.setShortcut(self.tr("Ctrl+S")) self.saveAct.setStatusTip(self.tr("Save the document to disk")) self.connect(self.saveAct, QtCore.SIGNAL("triggered()"), self.save) self.saveAsAct = QtGui.QAction(self.tr("Save &As..."), self) self.saveAsAct.setStatusTip(self.tr("Save the document under a new name")) self.connect(self.saveAsAct, QtCore.SIGNAL("triggered()"), self.saveAs) self.exitAct = QtGui.QAction(self.tr("E&xit"), self) self.exitAct.setShortcut(self.tr("Ctrl+Q")) self.exitAct.setStatusTip(self.tr("Exit the application")) self.connect(self.exitAct, QtCore.SIGNAL("triggered()"), self, QtCore.SLOT("close()")) self.cutAct = QtGui.QAction(QtGui.QIcon(":/images/cut.png"), self.tr("Cu&t"), self) self.cutAct.setShortcut(self.tr("Ctrl+X")) self.cutAct.setStatusTip(self.tr("Cut the current selection's contents to the " "clipboard")) self.connect(self.cutAct, QtCore.SIGNAL("triggered()"), self.textEdit, QtCore.SLOT("cut()")) self.copyAct = QtGui.QAction(QtGui.QIcon(":/images/copy.png"), self.tr("&Copy"), self) self.copyAct.setShortcut(self.tr("Ctrl+C")) self.copyAct.setStatusTip(self.tr("Copy the current selection's contents to the " "clipboard")) self.connect(self.copyAct, QtCore.SIGNAL("triggered()"), self.textEdit, QtCore.SLOT("copy()")) self.pasteAct = QtGui.QAction(QtGui.QIcon(":/images/paste.png"), self.tr("&Paste"), self) self.pasteAct.setShortcut(self.tr("Ctrl+V")) self.pasteAct.setStatusTip(self.tr("Paste the clipboard's contents into the current " "selection")) self.connect(self.pasteAct, QtCore.SIGNAL("triggered()"), self.textEdit, QtCore.SLOT("paste()")) self.aboutAct = QtGui.QAction(self.tr("&About"), self) self.aboutAct.setStatusTip(self.tr("Show the application's About box")) self.connect(self.aboutAct, QtCore.SIGNAL("triggered()"), self.about) self.aboutQtAct = QtGui.QAction(self.tr("About &Qt"), self) self.aboutQtAct.setStatusTip(self.tr("Show the Qt library's About box")) self.connect(self.aboutQtAct, QtCore.SIGNAL("triggered()"), QtGui.qApp, QtCore.SLOT("aboutQt()")) self.cutAct.setEnabled(False) self.copyAct.setEnabled(False) self.connect(self.textEdit, QtCore.SIGNAL("copyAvailable(bool)"), self.cutAct, QtCore.SLOT("setEnabled(bool)")) self.connect(self.textEdit, QtCore.SIGNAL("copyAvailable(bool)"), self.copyAct, QtCore.SLOT("setEnabled(bool)")) def createMenus(self): self.fileMenu = self.menuBar().addMenu(self.tr("&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(self.tr("&Edit")) self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.fileToolBar = self.addToolBar(self.tr("File")) self.fileToolBar.addAction(self.newAct) self.fileToolBar.addAction(self.openAct) self.fileToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar(self.tr("Edit")) self.editToolBar.addAction(self.cutAct) self.editToolBar.addAction(self.copyAct) self.editToolBar.addAction(self.pasteAct) def createStatusBar(self): self.statusBar().showMessage(self.tr("Ready")) def readSettings(self): settings = QtCore.QSettings("Trolltech", "Application Example") pos = settings.value("pos", QtCore.QVariant(QtCore.QPoint(200, 200))).toPoint() size = settings.value("size", QtCore.QVariant(QtCore.QSize(400, 400))).toSize() self.resize(size) self.move(pos) def writeSettings(self): settings = QtCore.QSettings("Trolltech", "Application Example") settings.setValue("pos", QtCore.QVariant(self.pos())) settings.setValue("size", QtCore.QVariant(self.size())) def maybeSave(self): if self.textEdit.document().isModified(): ret = QtGui.QMessageBox.warning(self, self.tr("Application"), self.tr("The document has been modified.\n" "Do you want to save your changes?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.Default, QtGui.QMessageBox.No, QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Escape) if ret == QtGui.QMessageBox.Yes: return self.save() elif ret == QtGui.QMessageBox.Cancel: return False return True def loadFile(self, fileName): file = QtCore.QFile(fileName) if not file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text): QtGui.QMessageBox.warning(self, self.tr("Application"), self.tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString())) return inf = QtCore.QTextStream(file) QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.textEdit.setPlainText(inf.readAll()) QtGui.QApplication.restoreOverrideCursor() self.setCurrentFile(fileName) self.statusBar().showMessage(self.tr("File loaded"), 2000) def saveFile(self, fileName): file = QtCore.QFile(fileName) if not file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text): QtGui.QMessageBox.warning(self, self.tr("Application"), self.tr("Cannot write file %1:\n%2.").arg(fileName).arg(file.errorString())) return False outf = QtCore.QTextStream(file) QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) outf << self.textEdit.toPlainText() QtGui.QApplication.restoreOverrideCursor() self.setCurrentFile(fileName); self.statusBar().showMessage(self.tr("File saved"), 2000) return True def setCurrentFile(self, fileName): self.curFile = fileName self.textEdit.document().setModified(False) self.setWindowModified(False) if self.curFile.isEmpty(): shownName = "untitled.txt" else: shownName = self.strippedName(self.curFile) self.setWindowTitle(self.tr("%1[*] - %2").arg(shownName).arg(self.tr("Application"))) def strippedName(self, fullFileName): return QtCore.QFileInfo(fullFileName).fileName() if __name__ == "__main__": app = QtGui.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_())