python - 将信息从小部件模块传递到主窗口

标签 python pyqt

如果我有一个非常简单(自包含、可重现)的程序,如下所示:

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/

相关文章:

python - PyQt 清除菜单栏

python - PyQt 和 QML - 如何创建自定义数据模型

python - 通过 pyramid Response 呈现动态生成的 HTML

python - Pandas 矢量化 - 在另一个 DataFrame 中查找最近的 future 时间

python - 从两个 pandas DataFrame 中选择前 N 个

python - 在 Qt 中捕获拖动退出?

python - Meld 无法在 Ubuntu 中启动

python - 如何将 SQLAlchemy 查询传递给execute(query_str, params) 函数

python - 平均值和最大值之间差距较大的列表的 Pyqt 步长

python - 用户如何向 QDoubleSpinBox 输入无穷大值?