Thursday, January 26, 2012

Qt 4.8 Application Example - Part 3

In the following code, the createMenus(), createToolBars() and createStatusBar() methods are implemented, using the actions created in Part 2.



#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
    PyQt4 conversion of Qt Application Example
    
        Implement createMenus(), createToolBars(), createStatusBar()
    
    BEHAVIOUR:
    =========
    The menus and toolbar icons are now available.
    Move the mouse over them to see their tooltips displayed
    in the window status bar.
    
    NOTES:
    =====
    The menus and toolbar share the QAction objects created
    earlier.
    
last modified: 2012-01-25 jg
ref: 
    http://developer.qt.nokia.com/doc/qt-4.8/mainwindows-application.html
'''
import sys
from PyQt4.QtGui import (QApplication, QMainWindow, QPlainTextEdit, QAction, QIcon, QKeySequence)
from PyQt4.QtCore import (pyqtSlot)
import qrc_app

class MainWindow(QMainWindow):      # subclass QMainWindow

    def __init__(self, parent=None):    # initialise base class
        super(MainWindow, self).__init__(parent)

        # create central widget        
        self._textEdit = QPlainTextEdit()
        self.setCentralWidget(self._textEdit)

        # create GUI
        self._createActions()
        self._createMenus()
        self._createToolBars()
        self._createStatusBar()

        # connect signals/slots for event handling
        self._textEdit.document().contentsChanged.connect(self._documentWasModified)

        # establish initial conditions
        self._readSettings()
        self._setCurrentFile('')
        self.setUnifiedTitleAndToolBarOnMac(True)

    # overridden methods ------------------------------------------------------
    def closeEvent(self, evt):
        pass

    # private slots -----------------------------------------------------------
    @pyqtSlot()
    def _newFile(self):
        pass

    @pyqtSlot()
    def _open(self):
        pass

    @pyqtSlot()
    def _save(self):
        pass

    @pyqtSlot()
    def _saveAs(self):
        pass

    @pyqtSlot()
    def _about(self):
        pass

    @pyqtSlot()
    def _documentWasModified(self):
        pass

    # private methods ---------------------------------------------------------
    def _createActions(self):
        self._newAct = QAction(QIcon(":/images/new.png"), self.tr("&New"), self)
        self._newAct.setShortcuts(QKeySequence.New)
        self._newAct.setStatusTip((self.tr("Create a new file.")))
        self._newAct.triggered.connect(self._newFile)

        self._openAct = QAction(QIcon(":/images/open.png"), self.tr("&Open"), self)
        self._openAct.setShortcuts(QKeySequence.Open)
        self._openAct.setStatusTip((self.tr("Open a file.")))
        self._openAct.triggered.connect(self._open)

        self._saveAct = QAction(QIcon(":/images/save.png"), self.tr("&Save"), self)
        self._saveAct.setShortcuts(QKeySequence.Save)
        self._saveAct.setStatusTip((self.tr("Save the document to disk.")))
        self._saveAct.triggered.connect(self._save)

        self._saveAsAct = QAction(self.tr("Save &As..."), self)
        self._saveAsAct.setShortcuts(QKeySequence.SaveAs)
        self._saveAsAct.setStatusTip((self.tr("Save the document under a new name.")))
        self._saveAsAct.triggered.connect(self._saveAs)

        self._exitAct = QAction(self.tr("E&xit"), self)
        self._exitAct.setShortcuts(QKeySequence.Quit)
        self._exitAct.setStatusTip((self.tr("Exit the application.")))
        self._exitAct.triggered.connect(self.close)

        self._aboutAct = QAction(self.tr("&About"), self)
        self._aboutAct.setStatusTip((self.tr("Show the application's About box.")))
        self._aboutAct.triggered.connect(self._about)

        self._aboutQtAct = QAction(self.tr("About &Qt"), self)
        self._aboutQtAct.setStatusTip((self.tr("Show the Qt library's About box.")))
        self._aboutQtAct.triggered.connect(QApplication.instance().aboutQt)

        # actions that connect to the 'textEdit' widget
        self._cutAct = QAction(QIcon(":/images/cut.png"), self.tr("Cu&t"), self)
        self._cutAct.setShortcuts(QKeySequence.Cut)
        self._cutAct.setStatusTip((self.tr("Cut the current selection's content to the clipboard.")))
        self._cutAct.triggered.connect(self._textEdit.cut)

        self._copyAct = QAction(QIcon(":/images/copy.png"), self.tr("&Copy"), self)
        self._copyAct.setShortcuts(QKeySequence.Copy)
        self._copyAct.setStatusTip((self.tr("Copy the current selection's content to the clipboard.")))
        self._copyAct.triggered.connect(self._textEdit.copy)

        self._pasteAct = QAction(QIcon(":/images/paste.png"), self.tr("&Paste"), self)
        self._pasteAct.setShortcuts(QKeySequence.Paste)
        self._pasteAct.setStatusTip((self.tr("Paste the clipboard contents into the current selection.")))
        self._pasteAct.triggered.connect(self._textEdit.paste)

        # set action visibility
        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):
        fileMenu = self.menuBar().addMenu(self.tr("&File"))
        fileMenu.addAction(self._newAct)
        fileMenu.addAction(self._openAct)
        fileMenu.addAction(self._saveAct)
        fileMenu.addAction(self._saveAsAct)
        fileMenu.addSeparator()
        fileMenu.addAction(self._exitAct)

        editMenu = self.menuBar().addMenu(self.tr("&Edit"))
        editMenu.addAction(self._cutAct)
        editMenu.addAction(self._copyAct)
        editMenu.addAction(self._pasteAct)

        self.menuBar().addSeparator()

        helpMenu = self.menuBar().addMenu(self.tr("&Help"))
        helpMenu.addAction(self._aboutAct)
        helpMenu.addAction(self._aboutQtAct)


    def _createToolBars(self):
        fileToolBar = self.addToolBar(self.tr("File"))
        fileToolBar.addAction(self._newAct)
        fileToolBar.addAction(self._openAct)
        fileToolBar.addAction(self._saveAct)

        editToolBar = self.addToolBar(self.tr("Edit"))
        editToolBar.addAction(self._cutAct)
        editToolBar.addAction(self._copyAct)
        editToolBar.addAction(self._pasteAct)

    def _createStatusBar(self):
        self.statusBar().showMessage(self.tr("Ready"))

    def _readSettings(self):
        pass

    def _writeSettings(self):
        pass

    def _maybeSave(self):
        pass

    def _loadFile(self, fname):
        pass

    def _saveFile(self, fname):
        pass

    def _setCurrentFile(self, fname):
        pass

    def _strippedName(self, fullFName):
        pass

# main ========================================================================
def main():
    app = QApplication(sys.argv)
    app.setOrganizationName("My Business")
    app.setApplicationName("Application Example")

    mw = MainWindow()
    mw.setWindowTitle("Application Example")
    mw.show()

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()