【问题标题】:Access widgets added in Qt Designer在 Qt 设计器中添加的访问小部件
【发布时间】:2016-07-10 18:34:51
【问题描述】:

我正在使用 Qt Designer 创建一个 Qt GUI。在设计器中,我在 QSplitter 中放置了两个小部件(一个小部件在左侧,另一个小部件在右侧)。

问题是现在我想分别控制每个小部件,但我的 MainWindow 中包含所有内容的 GUI python 代码,包括小部件及其内容(标签、文本标签等)。

有没有办法单独访问小部件?这是我的代码:

在主窗口上:

if __name__ == "__main__":

    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = mw_gui.Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    img_widget = ImageWidget(MainWindow)

    sys.exit(app.exec_())

在我想用来控制右侧小部件的类中:

class ImageWidget(QtGui.QWidget):
    def __init__(self, parent, variables):
        # self.ui = ui
        # self.variables = variables
        if not isinstance(parent, QtGui.QMainWindow):
            raise TypeError('parent must be a QMainWindow')
        super(ImageWidget, self).__init__()

        self._parentWidget = parent

我想访问 self.imglabel,它位于正确的小部件内,但似乎找不到。

【问题讨论】:

    标签: python qt widget pyside qt-designer


    【解决方案1】:

    您应该能够找到带有名称和类型的小部件:

    imglabel = self.ui.findChild(QtGui.QLabel, "imglabel")
    

    【讨论】:

      【解决方案2】:

      您应该为主窗口创建一个子类,继承自QMainWindowUi_MainWindow。使用这种方法,Qt Designer 中添加的所有小部件都可以作为实例属性访问:

      from PySide import QtGui
      from mw_gui import Ui_MainWindow
      
      class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.setupUi(self)
              self.imglabel.setPixmap(QtGui.QPixmap('image.png'))
      
      if __name__ == "__main__":
      
          import sys
          app = QtGui.QApplication(sys.argv)
          mainwindow = MainWindow()
          mainwindow.show()
          sys.exit(app.exec_())
      

      这样做也意味着可能不需要单独的控制器类,因为您只需将方法添加到MainWindow 类即可。如果所有内容都在一个命名空间中,则设计会简单得多。

      【讨论】:

      • 这是个好主意。然而,对于大型 GUI,MainWindow 类将非常大,因为它将具有所有 GUI 组件的回调方法。不同模块中是否可以有不同GUI组件的回调方法?
      • @nae9on 如果其他类/模块可以访问主窗口,那么如何组织代码并不重要。但是,我认为纯粹根据感知到的类的大小来拆分代码是错误的。 Python 不是 Java。