Когда вы компилируете модуль python из файла ui
с параметрами по умолчанию, он (помимо прочего) сгенерирует простой класс "setup". В общих чертах, класс установки будет выглядеть так:
class Ui_ClassCode(object):
def setupUi(self, ClassCode):
ClassCode.setObjectName("ClassCode")
# bunch of boiler-plate ui code goes here
self.retranslateUi(ClassCode)
QtCore.QMetaObject.connectSlotsByName(ClassCode)
def retranslateUi(self, ClassCode):
pass
Здесь следует обратить внимание на несколько вопросов, имеющих отношение к вопросу.
Во-первых, класс установки предназначен для использования в качестве миксина, а не в качестве прямого подкласса. Его задача - «внедрить» пользовательский интерфейс в виджет хоста, который передается методу setupUI
.
Во-вторых, классу установки присваивается некрасивый непифонический идентификатор, который создается путем добавления "Ui_" к свойству objectName
, заданному в Designer.
К счастью, pyuic4 позволяет обойти эти две проблемы. Все, что требуется, это использовать опцию -w
при компиляции модуля python из файла пользовательского интерфейса:
pyuic4 -w designerfile.ui > classfile.py
Это добавит класс-обертку, который (1) может быть легко разделен на подклассы, и (2) имеет имя класса , которое вы чертовски хорошо дали ему в Qt Designer.
Класс-оболочка будет выглядеть примерно так:
class ClassCode(QtGui.QWidget, Ui_ClassCode):
def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
QtGui.QWidget.__init__(self, parent, f)
self.setupUi(self)
Как видите, он не делает ничего особенного: вы можете легко скопировать то, что он делает, в своем собственном коде. Но, IMO, это делает скомпилированные модули более интуитивно понятными в использовании.
Например:
from PyQt4 import QtGui, QtCore
from classfile import ClassCode
class Stack(ClassCode):
def __init__(self, parent=None):
ClassCode.__init__(self, parent)
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.stack = Stack(self)
self.setCentralWidget(self.stack)