如果我有一个非常简单(自包含、可重现)的程序,如下所示:
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 个模块,以便开始为更大的项目提供一些构建 block (从长远来看......),那么我得到:
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 的要点,而且我完全错误地设计了我的模块的工作方式。如果是这种情况,请随时将我推回正确的方向...
最佳答案
这个问题有点模糊,因为您必须就用户如何与 GUI 交互做出一些设计决策。第一次尝试可能涉及以下一些内容:
1) 向您的小部件添加一个信号,并让它设置自己的名称。当它更改名称时,也会发出新名称的信号。
class testWidget(QtGui.QLabel):
textChanged = QtCore.pyqtSignal(object)
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)
self.setText(fileName)
self.textChanged.emit(fileName)
2) 添加小部件,并将其信号连接到主窗口中的插槽(回调)以更新其状态栏。
class mainWrapper(QtGui.QMainWindow):
def __init__(self):
super(mainWrapper, self).__init__()
def init_ui(self):
self.resize(800, 600)
self.statusBar().showMessage('Welcome to my 1st project')
self.tw = testWidget()
self.setCentralWidget(self.tw)
self.tw.textChanged.connect(self.update_status_bar)
self.tw.open()
def update_status_bar(self, f):
self.statusBar().showMessage("Showing file " + f)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
mw = mainWrapper()
mw.show()
mw.init_ui()
sys.exit(app.exec_())
** 如您所见,这实际上只适用于一个显示小部件。如果您想添加更多小部件,则必须将中央小部件设为通用小部件,设置其布局,并将其他小部件添加到其布局中。
关于python - 将信息从小部件模块传递到主窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18191939/