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

时间:2015-01-09 18:40:49

标签: python-2.7 user-interface pyqt4

所以我开始玩Qt Designer来学习构建一些GUI,现在我用一个GUI玩了很多,这与我想要的功能很接近。当然在开始时我没有正确地做到这一点,并没有设置布局框,只是在我认为合适的地方播放我的按钮/标签等。现在我在想,让它可扩展性会很好,但我想知道这是不是很简单?或者从头开始以适当的布局更好?

这是定义它的外观的部分(减去retranslateUi方法,只是将名称放在标签/按钮上):

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"))

1 个答案:

答案 0 :(得分:3)

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

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

  1. 将水平垫片放在三个按钮的右侧。
  2. 点击按钮左上角的表格,然后拖出一个选择矩形,使其覆盖按钮和垫片。
  3. 单击工具栏上的“水平布局”按钮
  4. 现在在绘图按钮的左侧放置一个水平垫片,并将此垫片和按钮放在水平布局中,如2& 3以上。
  5. 将两个标签放在水平布局的底部。
  6. 在两个标签下方放置一个单独的垂直垫片。
  7. 单击表单的空白区域,然后单击工具栏上的“网格中的布局”按钮。
  8. 这应该给你合理的初步结果,虽然你可能需要稍微调整一下才能达到你想要的效果。例如,要使窗口小部件(或子布局)跨越窗体的整个宽度,请选择它,然后使用拖动手柄根据需要拉伸它。

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

    <强>更新

    如果您继续编辑由pyuic生成的模块,那么几乎可以保证它不会成为可扩展的&#34;。您应该将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代码,并将其移动到一个单独的模块中。有关如何将GUI与主应用程序代码集成的各种示例,请参阅PyQt4文档中的Using Qt Designer