2011-12-17 5 views
5

내 프로그램을 정기적으로 실행하는 동안 블록 (3 개 스택) 위젯을 가로 레이아웃에 추가해야합니다. 각 블록 내의 위젯은 서로에게 중요하기 때문에 각 스택을 자체 위젯으로 캡슐화하여 레이아웃을 비즈니스에 훨씬 쉽게 추가 할 수 있기를 바랍니다.PyQt4 - 맞춤 위젯 클래스 구조?

PyQt4에서 '스택'을 위젯으로 인식하는 데 문제가 있습니다.

Qt 디자이너 (위젯)에서 위젯 스택을 만들고
'pyuic4 DesignerFile.ui> ClassFile.py'를 통해 .py로 변환했습니다.

이제이 스택 (.3 위젯의 상위 위젯)을 .addWidget (클래스)을 통해 레이아웃에 추가 할 수 없습니다.

내가 ...

  • 위젯으로 인식되지 중 스택 클래스의 수퍼 클래스 (I 스택에 더 많은 기능을 추가 할 필요가 있기 때문에)하지만 클래스의 인스턴스를한다 건설 시도

  • 보이지 않는
  • 내가 수퍼 클래스를 구조화하는 방법에 대해 잘 모르기 때문에 결함이 있습니다.

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

    누군가가 나를이 구조 돕거나 좋은 예에 저를 초래할 수 : 여기

(이것은 내가 해봤 8 클래스 구조에 대해 비록) 나는 순간에 실패하고있는 무슨이다 ?
는 (필자는 다음과 같은 소스 모두에 있지만 아무 소용와 코드를 모방했습니다!
http://lateral.netmanagers.com.ar/stories/27.html#what-you-need-to-follow-the-tutorial
http://zetcode.com/tutorials/pyqt4/customwidgets/)

감사합니다!

사양 :
파이썬 2.7.2
PyQt4
윈도우 7

답변

5

기본 옵션이있는 ui 파일에서 파이썬 모듈을 컴파일 할 때, (다른 것들 사이에) 간단한 "설정"클래스를 생성합니다. 개요에서 설치 클래스는 다음과 같이 표시됩니다.

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 

여기에 주목해야 할 몇 가지 문제점이 있습니다.

첫째, 설치 클래스는 직접 하위 클래스가 아닌 mixin으로 사용되도록 설계되었습니다.작업은 setupUI 메소드로 전달되는 호스트 위젯에 "주입"하는 것입니다.

두 번째로 설치 클래스에는 디자이너에서 설정 한 objectName 속성에 "Ui_"를 붙임으로써 만들어지는보기 흉하고 평범한 식별자가 지정됩니다.

다행히도 pyuic4는이 두 가지 문제를 우회 할 수있는 방법을 제공합니다.

pyuic4 -w designerfile.ui > classfile.py 

이 (1) 쉽게 서브 클래스화할 수있는 래퍼 클래스를 추가하고, (2) 클래스 이름을 가진 것 모든 것은 UI를 파일에서 파이썬 모듈을 컴파일 할 때 -w 옵션을 사용하는 것입니다 필요한 것 Qt 디자이너에서을 잘 주셨습니다.

래퍼 클래스는 다음과 같이 보일 것입니다 : 당신이 볼 수 있듯이

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) 
+0

위젯을 통해 사용할 생성자에 문자열을 전달할 수 있습니까 (인스턴스화 할 때 위젯이 가능합니까)? 예 : x = 스택 ('고양이') –

+1

@AntiEarth. 물론 : 다른 Qt 위젯을 하위 클래스로 만드는 것과 마찬가지로 원하는 방식으로 'Stack'서브 클래스를 디자인 할 수 있습니다. 그래서'Stack .__ init__ '의 서명은 예를 들어. '__init __ (self, name, parent = None)'. – ekhumoro

1

첫째, 그것은 super의 사용과 부모 __init__를 호출하는 것이 더 적절합니다. 그러면 적절한 수퍼 클래스의 메소드가 호출됩니다. 둘째, pyuic으로 생성 된 클래스를 사용할 때 __init__ 메소드에서 self.setupUi(self)으로 전화해야합니다. 그리고 마지막으로, 적절한 Qt 클래스와 pyuic 생성 클래스 (실제로 믹스 인이 더 많습니다)로부터 다중을 상속받을 필요가 있습니다.

그래서,이 같은 :

from ClassFile import ClassCode 

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

그는 실제로을 잡기위한 pyuic – jdi

+0

감사에 의해 생성 된 ClassCode에서 두 번째로 첫 번째 요구는 QWidget에서 상속되어야한다. 내 대답을 업데이트했습니다. –