PyQt4 - Структура класса пользовательского виджета? - PullRequest
6 голосов
/ 17 декабря 2011

В течение регулярных интервалов моей программы, блок (из 3-х стекованных) виджетов должен быть добавлен в горизонтальный макет.Поскольку виджеты в каждом блоке важны друг для друга, я хочу инкапсулировать каждый стек как свой собственный виджет (что значительно упрощает добавление макета).

У меня проблемы с получением PyQt4 для распознавания моего «стека»как виджет.

Я создал стек виджетов в Qt Designer (как form: widget) и преобразовал его в .py через
'pyuic4 DesignerFile.ui> ClassFile.py'.

Теперь я не могу добавить этот «стек» (родительский виджет 3 дочерних виджетов) в макет с помощью .addWidget (Class).

Я попытался создать суперкласс класса стека (потому чтоМне нужно добавить больше функций в стек), но экземпляр класса либо ...

  • Не распознан как виджет
  • Невидим
  • неисправен, потому чтоЯ понятия не имею, как структурировать суперкласс.

Вот то, с чем я сейчас не справляюсь (хотя речь идет о структуре восьмого класса, которую я пробовал):

from ClassFile import ClassCode

class Stack(ClassCode):
    def __init__(self,parent= None):
        QtGui.QWidget.__init__(self,parent)

Может ли кто-нибудь помочь мне структурироватьэто или привело меня к хорошим примерам?
(я имитировал код в обоих следующих источниках, но безрезультатно !!
http://lateral.netmanagers.com.ar/stories/27.html#what-you-need-to-follow-the-tutorial
http://zetcode.com/tutorials/pyqt4/customwidgets/)

Спасибо!

Характеристики:
python 2.7.2
PyQt4
Windows 7

Ответы [ 2 ]

5 голосов
/ 17 декабря 2011

Когда вы компилируете модуль 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)
1 голос
/ 17 декабря 2011

Во-первых, более уместно вызывать родителя __init__ с использованием super. Это обеспечит вызов метода в соответствующем суперклассе. Во-вторых, при использовании класса, созданного с помощью Pyuic, вам нужно вызвать self.setupUi(self) из вашего __init__ метода. И, наконец, вам нужно убедиться, что множественное наследование наследуется как от надлежащего класса Qt, так и от класса, сгенерированного Pyuic (который на самом деле представляет собой миксин).

Итак, как-то так:

from ClassFile import ClassCode

class Stack(QtGui.QWidget, ClassCode):
    def __init__(self,parent= None):
        super(Stack, self).__init__(parent)
        self.setupUi(self)
...