如果我有一个非常简单(自包含、可重现)的程序,如下所示:
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 个模块,以便开始为更大的项目(从长远来看......)提供一些构建块,那么我得到:
测试主窗口.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_())
测试小部件.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 的要点,并且我完全错误地设计了我的模块的工作方式。如果是这种情况,请随时将我推回到正确的方向......