1

次のような非常に単純な (自己完結型で再現可能な) プログラムがあるとします。

import sys
from PyQt4 import QtCore, QtGui, Qt

class mainWrapper(QtGui.QMainWindow):

  def __init__(self):
    super(mainWrapper, self).__init__()
    self.resize(800, 600)    
    self.statusBar().showMessage('Welcome to my 1st project')

    self.tw = testWidget()
    fileName = self.tw.open()

    self.setCentralWidget(Qt.QLabel(str(fileName)))
    self.statusBar().showMessage("Showing file " + str(fileName))

  def open(self):
    fileName = QtGui.QFileDialog.getOpenFileName(self, "Open File",
        QtCore.QDir.currentPath())
    if fileName.isNull():
      QtGui.QMessageBox.information(self, "test project",
         "Cannot load %s." % fileName)
    print fileName
    return fileName 

  if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mw = mainWrapper()
    mw.show()
    sys.exit(app.exec_())  

必要に応じて、ファイル名がメイン ウィンドウとステータス バーに出力されます。コードを変更して 2 つのモジュールに分割すると、より大きなプロジェクト (長期的には...) のいくつかのビルディング ブロックを開始するために、次のようになります。

testMainWindow.py

import sys
from PyQt4 import QtCore, QtGui, Qt

from testWidget import testWidget_widget

class mainWrapper(QtGui.QMainWindow):

  def __init__(self):
  super(mainWrapper, self).__init__()
  self.resize(800, 600)    
  self.statusBar().showMessage('Welcome to my 1st project')

  self.tw = testWidget()
  fileName = self.tw.open()

  self.setCentralWidget(Qt.QLabel(str(fileName)))
  self.statusBar().showMessage("Showing file " + str(fileName))

if __name__ == '__main__':
  app = QtGui.QApplication(sys.argv)
  mw = mainWrapper()
  mw.show()
  sys.exit(app.exec_())   

testWidget.py

from PyQt4 import QtCore, QtGui, Qt

class testWidget(QtGui.QWidget):

def __init__(self):
  super(testWidget, self).__init__()
  print "ImageViewer_widget called successfully"

def open(self):
  fileName = QtGui.QFileDialog.getOpenFileName(self, "Open File",
        QtCore.QDir.currentPath())
  if fileName.isNull():
    QtGui.QMessageBox.information(self, "test project",
         "Cannot load %s." % fileName)
  print fileName
  return fileName 

その後、メインウィンドウとステータスバーに期待どおりにファイル名が出力されます。ただし、これだけself.tw.open()です。私が本当にやりたいことは、ウィジェット モジュールにコンテンツを設定し、ウィジェットを呼び出すメソッドにできるだけ少ないコードを含めることです。その根拠は、これらのモジュールがより重要になったときです。testWidgetそのモジュールで行うコード。ただし、これsetCentralWidgetは の方法にすぎないことを考えるとQMainWindow、これを達成するための最良の方法は何ですか?

もちろん、PyQt についての要点を完全に見逃していたり​​、モジュールの動作方法を完全に誤って設計した可能性はあります。この場合は、お気軽に正しい方向に戻してください...

4

1 に答える 1