次のような非常に単純な (自己完結型で再現可能な) プログラムがあるとします。
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 についての要点を完全に見逃していたり、モジュールの動作方法を完全に誤って設計した可能性はあります。この場合は、お気軽に正しい方向に戻してください...