日本語 English

すべてをひとつに組み合わせる

これまでいろいろな設計をためしてきた combine.py の最後のバージョンです。このバージョンでは combine.ui とその派生物である ui_combine.py ファイルを取り除きます。この方法の明確な利点は、ずばりファイルが少ないことです。欠点は、いざ後から見た目を変更しようと思ったときに、手戻りがいらないというQtDesignerの利点がもう使えないことです。基礎的なプログラムの単純なGUIであれば、この方法を使う価値があるかもしれません。ともあれ、私の愛読するGUI設計の本ではこのフォームを使用しており、ビジュアルな支援のいらない簡単にフォームを設計する方法として勧めています。

コードやその他のリソースはいつものように以下の “リポジトリ“からダウンロードできます。

プログラムの修正はまずui_combine_allin1.pyのsetupUi関数をプログラム本体にコピーすることから始めます。プログラム名は combine_allin1.py とします。次にコピーした構文をすべてメインプログラムの__init__関数に貼り付けます。ここで少し変更をします。幸い、この変更はプログラムのプロセスの理解を確認するとても良い機会です。ついでに、インポートが必要なウィジェットを限定しましょう。そうすればもうコードのなかでQtCoreとQtGuiを明示的に指示する必要がなくなります。コードがすっきりしますね!

プログラムリストは次のとおりです。

  1. #!/usr/bin/env python
  2. # combine_allin1.py - combination of ShowGPL, About, Close scripts
  3. # The purpose of this version of program is to show implementation
  4. # of most code in one file - all_in_1!.
  5.  
  6. import sys
  7. import platform
  8.  
  9. import PySide
  10.  
  11. from PySide.QtCore import QRect
  12.                          QMessageBox,  QIcon, QAction, QWidget, QGridLayout,\
  13.                          QTextEdit, QMenuBar, QMenu, QStatusBar
  14.  
  15. __version__ = '0.0.0'
  16. import qrc_combine
  17.  
  18. class MainWindow(QMainWindow):
  19.     def __init__(self, parent=None):
  20.         super(MainWindow, self).__init__(parent)
  21. #        self.setObjectName("MainWindow")
  22.         self.resize(731, 475)
  23.         centralwidget = QWidget(self)
  24. #        centralwidget.setObjectName("centralwidget")
  25.         gridLayout = QGridLayout(centralwidget)
  26. #        gridLayout.setObjectName("gridLayout")
  27.         # textEdit needs to be a class variable.
  28.         self.textEdit = QTextEdit(centralwidget)
  29. #        self.textEdit.setObjectName("textEdit")
  30.         gridLayout.addWidget(self.textEdit, 0, 0, 1, 1)
  31.         self.setCentralWidget(centralwidget)
  32.         menubar = QMenuBar(self)
  33.         menubar.setGeometry(QRect(0, 0, 731, 29))
  34. #        menubar.setObjectName("menubar")
  35.         menu_File = QMenu(menubar)
  36. #        menu_File.setObjectName("menu_File")
  37.         self.setMenuBar(menubar)
  38.         statusbar = QStatusBar(self)
  39. #        statusbar.setObjectName("statusbar")
  40.         self.setStatusBar(statusbar)
  41.         actionShow_GPL = QAction(self)
  42. #        actionShow_GPL.setObjectName("actionShow_GPL")
  43.         actionShow_GPL.triggered.connect(self.showGPL)
  44.         action_About = QAction(self)
  45. #        action_About.setObjectName("action_About")
  46.         action_About.triggered.connect(self.about)        
  47.         iconToolBar = self.addToolBar("iconBar.png")
  48. #------------------------------------------------------
  49. # Add icons to appear in tool bar - step 1
  50.         actionShow_GPL.setIcon(QIcon(":/showgpl.png"))
  51.         action_About.setIcon(QIcon(":/about.png"))
  52.         action_Close = QAction(self)
  53.         action_Close.setCheckable(False)
  54.         action_Close.setObjectName("action_Close")        
  55.         action_Close.setIcon(QIcon(":/quit.png"))
  56. #------------------------------------------------------
  57. # Show a tip on the Status Bar - step 2
  58.         actionShow_GPL.setStatusTip("Show GPL Licence")
  59.         action_About.setStatusTip("Pop up the About dialog.")
  60.         action_Close.setStatusTip("Close the program.")
  61. #------------------------------------------------------
  62.         menu_File.addAction(actionShow_GPL)
  63.         menu_File.addAction(action_About)
  64.         menu_File.addAction(action_Close)
  65.         menubar.addAction(menu_File.menuAction())
  66.  
  67.         iconToolBar.addAction(actionShow_GPL)
  68.         iconToolBar.addAction(action_About)
  69.         iconToolBar.addAction(action_Close)
  70.         action_Close.triggered.connect(self.close)
  71.              
  72.     def showGPL(self):
  73.         '''Read and display GPL licence.'''
  74.         self.textEdit.setText(open('COPYING.txt').read())
  75.        
  76.     def about(self):
  77.         '''Popup a box with about message.'''
  78.         QMessageBox.about(self, "About PyQt, Platform and the like",
  79.                 """<b> About this program </b> v %s
  80.                <p>Copyright 2011 Your Name.
  81.                All rights reserved in accordance with
  82.                GPL v2 or later - NO WARRANTIES!
  83.                <p>This application can be used for
  84.                displaying OS and platform details.
  85.                <p>Python %s - PySide version %s - Qt version %s on %s""" % \
  86.                 (__version__, platform.python_version(), PySide.__version__,\
  87.                  PySide.QtCore.__version__, platform.system()))      
  88.        
  89. if __name__ == '__main__':
  90.     app = QApplication(sys.argv)
  91.     frame = MainWindow()
  92.     frame.show()
  93.     sys.exit(app.exec_())

特定の構文がそのまま残っていて、コメントアウトされていることに気づいたかと思います。コマンド setObjetName(‘name_string’) を含む構文です。コメントアウトした理由は、このコマンドがプログラムで全く使用されないからです。使用しなくてもプログラムは同じように実行されます。しかし、削除はしません。というのも、これらはもともと Qt Desginer によって作成されたフォームを、 pyside-uic スクリプトを使って変換したものだからです。ですから、ひょっとするとある種のデバッグをする場合に役に立つかもしれません。それに単にコメントアウトするだけですので手間もかかりません(実際には何も費用はかかりません!)。いってみれば妥協の産物というわけです。

このプログラムは、我々が探求してきた combine.py の最後のバリエーションです。気は熟しました。そろそろシンプルなエンジニアリングの問題を探索をしてもいい頃合いです。そして、その基礎プログラム用のためのGUI設計を、PySideを使って行いましょう。この例題はトラスの力を求めるとても簡単なものです。例題で使うデータ処理メソッドは現実的なもので、なおかつ規模もちょうどよいですから、このチュートリアルにはうってつけです。では、またお会いしましょう。 Asta la vista!

Return to PySideSimplicissimus

Categories: