2011-12-17 16 views
5

मेरे कार्यक्रम के नियमित अंतराल के दौरान, क्षैतिज लेआउट में एक ब्लॉक (3 स्टैक्ड) विजेट्स को जोड़ा जाना आवश्यक है। चूंकि प्रत्येक ब्लॉक के भीतर विजेट एक दूसरे के लिए महत्वपूर्ण हैं, इसलिए मैं प्रत्येक स्टैक को अपने स्वयं के विजेट के रूप में समाहित करना चाहता हूं (लेआउट को व्यवसाय को अधिक आसान बनाना)।PyQt4 - कस्टम विजेट वर्ग संरचना?

मुझे विजेट के रूप में मेरे 'स्टैक' को पहचानने के लिए PyQt4 प्राप्त करने में समस्या हो रही है।

मैं क्यूटी डिजाइनर में विजेट ढेर (फार्म के रूप में: विजेट) बना दिया है और
'pyuic4 DesignerFile.ui> ClassFile.py' के माध्यम से एक .py करने के लिए इसे बदल दिया।

अब मैं इस 'स्टैक' (3 बाल विगेट्स के पैरेंट विजेट) को .addWidget (क्लास) के माध्यम से लेआउट में नहीं जोड़ सकता।

मैं ढेर वर्ग के एक सुपर वर्ग (क्योंकि मैं ढेर में अधिक कार्यक्षमता जोड़ने की जरूरत है), लेकिन वर्ग के उदाहरण है का निर्माण या तो ...

  • एक विजेट के रूप में मान्यता प्राप्त नहीं की कोशिश की
  • अदृश्य
  • दोषपूर्ण क्योंकि मुझे सुपर क्लास को कैसे व्यवस्थित करना है, इस बारे में कोई जानकारी नहीं है।

    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 

यहां कुछ नोटिस हैं जो प्रश्न के लिए प्रासंगिक हैं।

सबसे पहले, सेटअप क्लास को सीधे उप-वर्ग के बजाय मिश्रित के रूप में उपयोग करने के लिए डिज़ाइन किया गया है।यह कार्य है कि ui को एक होस्ट विजेट में "इंजेक्ट" करना है जो setupUI विधि को पारित किया गया है।

दूसरा, सेटअप क्लास को एक बदसूरत, अवांछित पहचानकर्ता दिया जाता है जिसे "Ui_" को objectName प्रॉपर्टी में डिज़ाइनर में सेट किया गया था।

सौभाग्य से, pyuic4 इन दो मुद्दों को बाईपास करने का एक तरीका प्रदान करता है।

pyuic4 -w designerfile.ui > classfile.py 

यह है कि (1) आसानी से किया जा सकता है subclassed एक आवरण वर्ग जोड़ देगा, और (2) वर्ग का नाम है: सभी कि जब ui फ़ाइल से अजगर मॉड्यूल संकलन -w विकल्प का उपयोग करने की आवश्यकता है है कि आपने क्यूटी डिजाइनर में इसे दिया है।

आवरण वर्ग कुछ इस तरह दिखेगा:

class ClassCode(QtGui.QWidget, Ui_ClassCode): 
    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()): 
     QtGui.QWidget.__init__(self, parent, f) 

     self.setupUi(self) 

आप देख सकते हैं, यह कुछ भी विशेष नहीं करता है: आप आसानी से दोहराने सकता है क्या यह अपने खुद के कोड में करता है। लेकिन, आईएमओ, यह संकलित मॉड्यूल का उपयोग करने के लिए और अधिक सहज ज्ञान युक्त बनाता है।

उदाहरण के लिए:

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

क्या यह विजेट के माध्यम से प्रयुक्त करने के लिए कन्स्ट्रक्टर (जब विस्थापन विजेट) को स्ट्रिंग पास करने में सक्षम होना संभव है? उदाहरण: एक्स = स्टैक ('बिल्ली') –

+1

@ एंटीअर्थ। निश्चित रूप से: आप अपने 'स्टैक' सबक्लास को किसी भी तरह से डिज़ाइन कर सकते हैं - बस किसी भी अन्य क्यूटी विजेट को उपclassing की तरह। तो 'स्टैक .__ init__' का हस्ताक्षर बदल दिया जा सकता है उदा। '__init __ (स्वयं, नाम, अभिभावक = कोई नहीं)'। – ekhumoro

1

सबसे पहले, यह super के उपयोग के साथ माता-पिता __init__ कॉल करने के लिए अधिक उपयुक्त है। यह सुनिश्चित करेगा कि उचित सुपर क्लास में विधि लागू की जाएगी। दूसरा, प्यूइक के साथ निर्मित कक्षा का उपयोग करते समय, आपको को अपने __init__ विधि से कॉल करने की आवश्यकता है। और आखिरकार, आपको उचित क्यूटी कक्षा और प्यूईक जेनरेट क्लास (जो वास्तव में एक मिश्रण के अधिक है) से सुनिश्चित करने और एकाधिक उत्तराधिकारी की आवश्यकता है।

तो, कुछ इस तरह:

from ClassFile import ClassCode 

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

वह वास्तव में ClassCode कि द्वारा कि पकड़ने के लिए pyuic – jdi

+0

धन्यवाद जनरेट किया गया था से पहले वांछित QWidget से इनहेरिट किया जाना चाहिए, और दूसरी। मैंने अपना जवाब अपडेट कर लिया है। –

संबंधित मुद्दे