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 个模块,以便开始为更大的项目(从长远来看......)提供一些构建块,那么我得到:

测试主窗口.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 的要点,并且我完全错误地设计了我的模块的工作方式。如果是这种情况,请随时将我推回到正确的方向......

4

1 回答 1

1

这个问题有点模糊,只是因为您必须对用户如何与 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_())  

** 如您所见,这实际上只适用于一个显示小部件。如果要添加更多小部件,则必须将中央小部件设为通用小部件,设置其布局,并将其他小部件添加到其布局中。

于 2013-08-12T17:18:37.753 回答