class %{APPNAME} < Qt::MainWindow Q_SLOTS :newFile, :open, :save, :saveAs, :about, :documentWasModified def initialize super @textEdit = Qt::TextEdit.new setCentralWidget(@textEdit) createActions() createMenus() createToolBars() createStatusBar() readSettings() connect(@textEdit.document, SIGNAL(:contentsChanged), self, SLOT(:documentWasModified)) setCurrentFile("") end def closeEvent(event) if maybeSave writeSettings event.accept else event.ignore end end def newFile() if maybeSave @textEdit.clear setCurrentFile("") end end def open() if maybeSave fileName = Qt::FileDialog.getOpenFileName(self) if !fileName.nil? loadFile(fileName) end end end def save() if @curFile.nil? return saveAs() else return saveFile(@curFile); end end def saveAs() fileName = Qt::FileDialog.getSaveFileName(self) if fileName.nil? return false end return saveFile(fileName) end def about() Qt::MessageBox.about(self, tr("About Application"), tr("The Application example demonstrates how to " \ "write modern GUI applications using Qt, with a menu bar, " \ "toolbars, and a status bar.")) end def documentWasModified() setWindowModified(true) end def createActions() @newAct = Qt::Action.new(Qt::Icon.new(":/filenew.xpm"), tr("&New"), self) @newAct.shortcut = tr("Ctrl+N") @newAct.statusTip = tr("Create a new file") connect(@newAct, SIGNAL(:triggered), self, SLOT(:newFile)) @openAct = Qt::Action.new(Qt::Icon.new(":/fileopen.xpm"), tr("&Open..."), self) @openAct.shortcut = tr("Ctrl+O") @openAct.statusTip = tr("Open an existing file") connect(@openAct, SIGNAL(:triggered), self, SLOT(:open)) @saveAct = Qt::Action.new(Qt::Icon.new(":/filesave.xpm"), tr("&Save"), self) @saveAct.shortcut = tr("Ctrl+S") @saveAct.statusTip = tr("Save the document to disk") connect(@saveAct, SIGNAL(:triggered), self, SLOT(:save)) @saveAsAct = Qt::Action.new(tr("Save &As..."), self) @saveAsAct.statusTip = tr("Save the document under a new name") connect(@saveAsAct, SIGNAL(:triggered), self, SLOT(:saveAs)) @exitAct = Qt::Action.new(tr("E&xit"), self) @exitAct.shortcut = tr("Ctrl+Q") @exitAct.statusTip = tr("Exit the application") connect(@exitAct, SIGNAL(:triggered), self, SLOT(:close)) @cutAct = Qt::Action.new(Qt::Icon.new(":/editcut.xpm"), tr("Cu&t"), self) @cutAct.shortcut = tr("Ctrl+X") @cutAct.statusTip = tr("Cut the current selection's contents to the " \ "clipboard") connect(@cutAct, SIGNAL(:triggered), @textEdit, SLOT(:cut)) @copyAct = Qt::Action.new(Qt::Icon.new(":/editcopy.xpm"), tr("&Copy"), self) @copyAct.shortcut = tr("Ctrl+C") @copyAct.statusTip = tr("Copy the current selection's contents to the " \ "clipboard") connect(@copyAct, SIGNAL(:triggered), @textEdit, SLOT(:copy)) @pasteAct = Qt::Action.new(Qt::Icon.new(":/editpaste.xpm"), tr("&Paste"), self) @pasteAct.shortcut = tr("Ctrl+V") @pasteAct.statusTip = tr("Paste the clipboard's contents into the current " \ "selection") connect(@pasteAct, SIGNAL(:triggered), @textEdit, SLOT(:paste)) @aboutAct = Qt::Action.new(tr("&About"), self) @aboutAct.statusTip = tr("Show the application's About box") connect(@aboutAct, SIGNAL(:triggered), self, SLOT(:about)) @aboutQtAct = Qt::Action.new(tr("About &Qt"), self) @aboutQtAct.statusTip = tr("Show the Qt library's About box") connect(@aboutQtAct, SIGNAL(:triggered), $tqApp, SLOT(:aboutQt)) @cutAct.setEnabled(false) @copyAct.setEnabled(false) connect(@textEdit, SIGNAL('copyAvailable(bool)'), @cutAct, SLOT('setEnabled(bool)')) connect(@textEdit, SIGNAL('copyAvailable(bool)'), @copyAct, SLOT('setEnabled(bool)')) end def createMenus() @fileMenu = menuBar().addMenu(tr("&File")) @fileMenu.addAction(@newAct) @fileMenu.addAction(@openAct) @fileMenu.addAction(@saveAct) @fileMenu.addAction(@saveAsAct) @fileMenu.addSeparator() @fileMenu.addAction(@exitAct) @editMenu = menuBar.addMenu(tr("&Edit")) @editMenu.addAction(@cutAct) @editMenu.addAction(@copyAct) @editMenu.addAction(@pasteAct) menuBar.addSeparator() @helpMenu = menuBar().addMenu(tr("&Help")) @helpMenu.addAction(@aboutAct) @helpMenu.addAction(@aboutQtAct) end def createToolBars() @fileToolBar = addToolBar(tr("File")) @fileToolBar.addAction(@newAct) @fileToolBar.addAction(@openAct) @fileToolBar.addAction(@saveAct) @editToolBar = addToolBar(tr("Edit")) @editToolBar.addAction(@cutAct) @editToolBar.addAction(@copyAct) @editToolBar.addAction(@pasteAct) end def createStatusBar() statusBar.showMessage(tr("Ready")) end def readSettings() settings = Qt::Settings.new("Trolltech", "Application Example") pos = settings.value("pos", Qt::Variant.new(Qt::Point.new(200, 200))).toPoint() size = settings.value("size", Qt::Variant.new(Qt::Size.new(400, 400))).toSize() resize(size) move(pos) end def writeSettings() settings = Qt::Settings.new("Trolltech", "Application Example") settings.setValue("pos", Qt::Variant.new(pos())) settings.setValue("size", Qt::Variant.new(size())) end def maybeSave() if @textEdit.document.modified? ret = Qt::MessageBox.warning(self, tr("Application"), tr("The document has been modified.\n" \ "Do you want to save your changes?"), Qt::MessageBox::Yes | Qt::MessageBox::Default, Qt::MessageBox::No, Qt::MessageBox::Cancel | Qt::MessageBox::Escape) if ret == Qt::MessageBox::Yes return save() elsif ret == Qt::MessageBox::Cancel return false end end return true end def loadFile(fileName) file = Qt::File.new(fileName) if !file.open(Qt::File::ReadOnly | Qt::File::Text) Qt::MessageBox.warning( self, tr("Application"), tr("Cannot read file %s\n%s." % [fileName, file.errorString]) ) return end inf = Qt::TextStream.new(file) Qt::Application.overrideCursor = Qt::Cursor.new(Qt::WaitCursor) @textEdit.setPlainText(inf.readAll) Qt::Application.restoreOverrideCursor() setCurrentFile(fileName) statusBar.showMessage(tr("File loaded"), 2000) end def saveFile(fileName) file = Qt::File.new(fileName) if !file.open(Qt::File::WriteOnly | Qt::File::Text) Qt::MessageBox.warning(self, tr("Application"), tr("Cannot write file %s\n%s." % [fileName, file.errorString]) ) return false end outf = Qt::TextStream.new(file) Qt::Application.overrideCursor = Qt::Cursor.new(Qt::WaitCursor) outf << @textEdit.toPlainText() Qt::Application.restoreOverrideCursor() outf.flush setCurrentFile(fileName) statusBar().showMessage(tr("File saved"), 2000) return true end def setCurrentFile(fileName) @curFile = fileName; @textEdit.document().modified = false setWindowModified(false) shownName = "" if @curFile.nil? shownName = "untitled.txt" else shownName = strippedName(@curFile) end setWindowTitle(tr("%s[*] - %s" % [shownName, tr("Application")])) end def strippedName(fullFileName) return Qt::FileInfo.new(fullFileName).fileName() end end