使 PyQt 可扩展(在编写之后)是微不足道的吗?

Is it trivial to make a PyQt scalable (after having it written)?

所以我开始尝试使用 Qt Designer 来学习构建一些 GUI,现在我已经在一个 GUI 上玩了很多,这已经接近我想要的功能了。当然一开始我做的不对,没有设置布局框,只是把我的buttons/labels之类的打到合适的地方。现在我在想,让它具有可扩展性会很好,但我想知道这是否简单?还是通过适当的布局从头开始更好?

这是定义其外观的部分(减去 retranslateUi 方法,它只是将名称放在 labels/buttons 上):

def setupUi(self, Form):
    Form.setObjectName(_fromUtf8("Form"))
    Form.resize(715, 571)

    self.toolButtonLoad = QtGui.QToolButton(Form)
    self.toolButtonLoad.setGeometry(QtCore.QRect(40, 250, 23, 25))
    self.toolButtonLoad.setObjectName(_fromUtf8("toolButtonLoad"))


    self.prevButton = QtGui.QPushButton(Form)
    self.prevButton.setGeometry(QtCore.QRect(70, 250, 98, 27))
    self.prevButton.setObjectName(_fromUtf8("prevButton"))
    self.nextButton = QtGui.QPushButton(Form)
    self.nextButton.setGeometry(QtCore.QRect(180, 250, 98, 27))
    self.nextButton.setObjectName(_fromUtf8("nextButton"))
    self.horizontalSliderFrames = QtGui.QSlider(Form)
    self.horizontalSliderFrames.setGeometry(QtCore.QRect(40, 280, 601, 29))
    self.horizontalSliderFrames.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalSliderFrames.setObjectName(_fromUtf8("horizontalSliderFrames"))
    self.labelMain = QtGui.QLabel(Form)
    self.labelMain.setGeometry(QtCore.QRect(70, 30, 531, 171))
    self.labelMain.setObjectName(_fromUtf8("labelMain"))
    self.labelBigIW = QtGui.QLabel(Form)
    self.labelBigIW.setGeometry(QtCore.QRect(200, 350, 128, 128))
    self.labelBigIW.setObjectName(_fromUtf8("labelBigIW"))
    self.labelSmallIW = QtGui.QLabel(Form)
    self.labelSmallIW.setGeometry(QtCore.QRect(70, 380, 64, 64))
    self.labelSmallIW.setObjectName(_fromUtf8("labelSmallIW"))


    self.pushButton = QtGui.QPushButton(Form)

    self.pushButton.setText("Plot Correlation Matrix")

    self.pushButton.setGeometry(QtCore.QRect(440, 350, 200, 50))

    #self.labelCorr = QtGui.QLabel(Form)
    #self.labelCorr.setGeometry(QtCore.QRect(440, 350, 221, 171))
    #self.labelCorr.setObjectName(_fromUtf8("labelCorr"))

    self.horizontalScrollBarIW = QtGui.QScrollBar(Form)
    self.horizontalScrollBarIW.setGeometry(QtCore.QRect(300, 260, 341, 16))
    self.horizontalScrollBarIW.setOrientation(QtCore.Qt.Horizontal)
    self.horizontalScrollBarIW.setObjectName(_fromUtf8("horizontalScrollBarIW"))
    self.verticalScrollBarIW = QtGui.QScrollBar(Form)
    self.verticalScrollBarIW.setGeometry(QtCore.QRect(660, 20, 16, 231))
    self.verticalScrollBarIW.setOrientation(QtCore.Qt.Vertical)
    self.verticalScrollBarIW.setObjectName(_fromUtf8("verticalScrollBarIW"))

创建当前 ui 文件的副本并在 Qt Designer 中并排打开这两个文件以便比较结果。

根据您显示的示例代码,您可以使用以下步骤轻松添加布局:

  1. 在三个按钮的右侧放置水平分隔符。
  2. 单击按钮左上角的表格并拖出一个 selection 矩形,使其覆盖按钮和垫片。
  3. 单击工具栏上的“水平布局”按钮
  4. 现在在绘图按钮的左侧放置一个水平间隔,并将此间隔和按钮放置在水平布局中,如上面的 2 和 3。
  5. 将底部的两个标签水平布局。
  6. 在两个标签下方放置一个单独的垂直分隔符。
  7. 单击表单的空白区域,然后单击工具栏上的“在网格中布局”按钮。

这应该会给您合理的初始结果,尽管您可能需要稍微调整一下才能达到您想要的效果。例如,要让小部件(或子布局)跨越整个表单宽度,select 它,然后使用拖动手柄将其拉伸为 required.

有关详细信息,请参阅 Qt 文档中的 Layout Management 概述。

更新:

如果您继续编辑由 pyuic 生成的模块,那几乎可以保证它永远不会是 "scalable"。您应该将 GUI 定义与主要应用程序逻辑完全分开,以便您可以使用 Qt Designer 更新 ui 文件并在必要时重新生成 python 模块。

因此第 0 步应该是从现有的 python 模块重新创建设计器 ui 文件。这可以使用 QFormBuilder:

来完成
window = MainWindow()
stream = QtCore.QFile('mainwindow.ui')
stream.open(QtCore.QIODevice.WriteOnly)
QtDesigner.QFormBuilder().save(stream, window)
stream.close()

这可能并不总是完全 重现当前的 GUI,但它应该为您提供了一个良好的起点。整理好之后,您可以从现有的 python 模块中提取非 GUI 代码,并将其移至单独的模块中。请参阅 PyQt4 文档中的 Using Qt Designer,了解如何将 GUI 与主要应用程序代码集成的各种示例。