2011-12-17 73 views
5

在我的程序的固定間隔期間,需要將一個塊(3堆疊)小部件添加到水平佈局。由於每個塊中的小部件對彼此都很重要,因此我希望將每個堆棧封裝爲自己的小部件(使佈局更容易)。PyQt4 - 自定義窗口小部件的類結構?

我無法讓PyQt4將我的'堆棧'識別爲一個小部件。

我在Qt設計器(作爲窗體:小部件)中創建了小部件堆棧,並通過
'pyuic4 DesignerFile.ui> ClassFile.py'將其轉換爲.py。

現在我似乎無法通過.addWidget(Class)將此「堆棧」(3個子小部件的父小部件)添加到佈局。

我試圖構建一個超類Stack類的(因爲我需要更多的功能添加到堆棧),但該類的實例要麼...

  • 不被識別爲一個widget
  • 隱形
  • 有缺陷,因爲我不知道如何構建超類。

這裏就是我與此刻故障(雖然它是關於第8類結構我試過):

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/

謝謝!

規格:
蟒蛇2.7.2
PyQt4的
Windows 7的

回答

5

當您從ui文件默認選項編譯一個Python模塊,將(其中包括)生成一個簡單的「設置」類。概括而言,設置類將如下所示:

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而不是直接子類。它的任務是將ui「注入」到傳遞給setupUI方法的主機小部件中。

其次,安裝類會被賦予一個醜陋的非音素標識符,該標識符是通過將「Ui_」添加到在Designer中設置的objectName屬性而創建的。

幸運的是,pyuic4提供了一種方法來繞過這兩個問題。所有的需要的是從UI文件編譯Python模塊時使用的-w選項:

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

是否可以將字符串傳遞給構造函數(在實例化小部件時)通過小部件使用?例如:x = Stack('cat') –

+1

@AntiEarth。當然:你可以用你喜歡的任何方式設計你的Stack類,就像繼承任何其他Qt部件一樣。所以'Stack.__ init__'的簽名可以改成例如'__init __(self,name,parent = None)'。 – ekhumoro

1

首先,這是比較合適的調用父__init__配合使用super。這將確保適當的超類中的方法被調用。其次,如果使用用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

他其實應該首先從所需的QWidget從由pyuic – jdi

+0

感謝用來捕獲產生的ClassCode繼承,其次。我已經更新了我的答案。 –

相關問題