日本語 English French [qt-devnet.developpez.com]

組み合わせの代案

この例題のプログラム名はcombine_alter.pyです。このプログラムはcombine.pyとほとんど同じ動作をしますが、わずかに違いがあります−多重継承を回避しているのです。多重継承はPythonの素晴らしい特徴ですが、多くのプログラマー、特に他の言語から移行した人々は、多重継承を使いたがりません。というのもPythonは多重継承をサポートする数少ない言語だからです(例えばC++は多重継承をサポートしていますが、javaやC#などの一般的なオブジェクト指向言語ではサポートされていません)。私達は最初に多重継承を使う方法を学びましたが、実はこのように多重継承には好き嫌いがあるのです。プログラム名をcombine.pyに”_alter“を追加したcombine_alter.pyとして、combine.pyとの違いをはっきりさせましょう。combine.uiとqrc_combine.pyには変更がないのでファイルのアップロードに頭を悩まされることはありません。そのまま使いましょう。プログラムはいつもの場所から入手できます。

combine_alter.pyとcombine.pyとの違いはそれほど大きくありません。ui_combineのimport文を変更していますが、これは純粋に美しさのためです。ローカル変数uiが初期化構文の冒頭で導入されています。ご覧のようにuiはinit関数以外にも使用するので、クラス変数にも格納します。Pythonプログラマーにとってはおなじみだと思いますが、init関数の引数はローカル変数として受けとり、速やかにクラス変数へ格納します。

  1. #!/usr/bin/env python
  2. # combine_alter.py - combination of ShowGPL, About, Close scripts
  3.  
  4. import sys
  5. import platform
  6.  
  7. import PySide
  8.                          QMessageBox,  QIcon
  9.  
  10. __version__ = '0.0.0'
  11. from ui_combine import Ui_MainWindow as Ui
  12. import qrc_combine
  13.  
  14. class MainWindow(QMainWindow):
  15.     def __init__(self, parent=None):
  16.         super(MainWindow, self).__init__(parent)
  17.         ui = Ui()
  18.         # Store ui as class variable self.ui
  19.         self.ui = ui
  20.         ui.setupUi(self)
  21.         ui.actionShow_GPL.triggered.connect(self.showGPL)
  22.         ui.action_About.triggered.connect(self.about)        
  23.         iconToolBar = self.addToolBar("iconBar.png")
  24. #------------------------------------------------------
  25. # Add icons to appear in tool bar - step 1
  26.         ui.actionShow_GPL.setIcon(QIcon(":/showgpl.png"))
  27.         ui.action_About.setIcon(QIcon(":/about.png"))
  28.         ui.action_Close.setIcon(QIcon(":/quit.png"))
  29. #------------------------------------------------------
  30. # Show a tip on the Status Bar - step 2
  31.         ui.actionShow_GPL.setStatusTip("Show GPL Licence")
  32.         ui.action_About.setStatusTip("Pop up the About dialog.")
  33.         ui.action_Close.setStatusTip("Close the program.")
  34. #------------------------------------------------------        
  35.         iconToolBar.addAction(ui.actionShow_GPL)
  36.         iconToolBar.addAction(ui.action_About)
  37.         iconToolBar.addAction(ui.action_Close)
  38.        
  39.     def showGPL(self):
  40.         '''Read and display GPL licence.'''
  41.         self.ui.textEdit.setText(open('COPYING.txt').read())
  42.        
  43.     def about(self):
  44.         '''Popup a box with about message.'''
  45.         QMessageBox.about(self, "About PyQt, Platform and the like",
  46.                 """<b> About this program </b> v %s
  47.                <p>Copyright 2010 Joe Bloggs.
  48.                All rights reserved in accordance with
  49.                GPL v2 or later - NO WARRANTIES!
  50.                <p>This application can be used for
  51.                displaying OS and platform details.
  52.                <p>Python %s -  PySide version %s - Qt version %s on %s""" % \
  53.                 (__version__, platform.python_version(), PySide.__version__,\
  54.                  PySide.QtCore.__version__, platform.system()))      
  55.        
  56. if __name__ == '__main__':
  57.     app = QApplication(sys.argv)
  58.     frame = MainWindow()
  59.     frame.show()
  60.     app.exec_()

多重継承を使うか使わないか、どちらの方法を選ぶのかは基本的には好みの問題です。いずれにしても決めるのは簡単ですが、将来出会ったときのために、両方の方法についていくらかでも理解しておくと良いでしょう。

基本的なプログラム構成のわずかな表現の違いをお楽しみください!

PySideSimplicissimusに戻る

Categories:

  • PySide Japanese
  •