2012-01-11 6 views
15

पर अलग यूआई विजेट जोड़ने के लिए मैंने हाल ही में प्रोग्रामिंग और पायथन (पीईक्यूटी) विशेष रूप से शुरू किया है। मेरे पास मेरा मुख्य QMainWindow वर्ग है। लेकिन मैं इसे यूआई विगेट्स से अलग करना चाहता था, ताकि सभी विंडोज़ सामान (मेनू, टूलबार, सामान्य बटन) QMainWindow में हों, लेकिन सभी प्रोग्राम/यूआई विशिष्ट विजेट (पुसबूटन, कंबोबॉक्स, इमेजेस, चेकबॉक्स इत्यादि) अलग QWidget में हैं कक्षा। लेकिन मुझे यकीन नहीं है कि मैं यह सही कर रहा हूं।पीईक्यूटी - QMainWindow

  1. मैं लेआउट के साथ एक समस्या है - कुछ अदृश्य मेनू को कवर किया जाता है, ताकि वे माउस द्वारा क्लिक करने योग्य नहीं कर रहे हैं, मुझे लगता है कि मैं सही ढंग से मुख्य विंडो पर मेरी यूआई विजेट जोड़कर नहीं कर रहा हूँ

यहां बताया गया है कि मैं यह कर:

class MyMainWindow(QMainWindow): 
    def __init__(self, parent = None): 
     super(MyMainWindow, self).__init__(parent) 

     self.main_widget = QWidget(self) 
     ... 
     self.form_widget = FormWidget(self) 
     #This is my UI widget 

     self.main_layout = QVBoxLayout(self.main_widget) 
     self.main_layout.sizeConstraint = QLayout.SetDefaultConstraint 
     self.main_layout.addWidget(self.form_widget.main_widget) 
     #form_widget has its own main_widget where I put all other widgets onto 

     self.main_widget.setLayout(self.main_layout) 
     self.setCentralWidget(self.main_widget) 
  1. मैं अन्य अजगर कार्यक्रमों जहां अनुप्रयोगों कोड के छोटे फ़ाइलों का एक बहुत में तोड़ा जाता है (जैसा कि मैंने यह समझने देखा है, पर में मुख्य वर्ग पढ़ने योग्य नहीं है सब कुछ होने के या अप्रबंधनीय)।

छोटे टुकड़ों में कोड तोड़ने के बारे में आपका सुझाव क्या है? यह बेहतर कैसे किया जाता है? या यूआई के लिए यह सब एक बड़ी जगह में हो सकता है? क्या मुझे यूआई कोड/कक्षाओं को अलग फाइल में तोड़ना चाहिए?

धन्यवाद।

[हल]

मैं अपनी गलती पाया - मैं यूआई विजेट वर्ग से main_widget (अब सभी UI विजेट्स यूआई वर्ग विजेट पर ही सीधे रखा जाता है) और ऐसा केवल तभी कर नष्ट कर दिया:

self.main_layout.addWidget(self.form_widget) 

मेनू के साथ कोई और समस्या नहीं

+0

मुझे मेरी गलती मिली है। मैंने UI विजेट से main_widget को हटा दिया है और खुद को अन्य सभी छोटे विगेट्स (बटन, एडिटलाइन इत्यादि) के लिए होल्डिंग विजेट के रूप में उपयोग किया है, और मुख्य वर्ग बस यूआई विजेट (ऊपर देखें) को तुरंत चालू करता है - मेनू समस्या हल हो जाती है। – linuxoid

उत्तर

20

क्या आप इस तरह कुछ ढूंढ रहे हैं? मैं वास्तव में यह सुनिश्चित करें कि आपके main_widget

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

import sys 

class MyMainWindow(QMainWindow): 

    def __init__(self, parent=None): 

     super(MyMainWindow, self).__init__(parent) 
     self.form_widget = FormWidget(self) 
     self.setCentralWidget(self.form_widget) 


class FormWidget(QWidget): 

    def __init__(self, parent):   
     super(FormWidget, self).__init__(parent) 
     self.layout = QVBoxLayout(self) 

     self.button1 = QPushButton("Button 1") 
     self.layout.addWidget(self.button1) 

     self.button2 = QPushButton("Button 2") 
     self.layout.addWidget(self.button2) 

     self.setLayout(self.layout) 

app = QApplication([]) 
foo = MyMainWindow() 
foo.show() 
sys.exit(app.exec_()) 
7

मैं क्यूटी डिजाइनर का उपयोग कर संभव के रूप में यूआई के रूप में ज्यादा बनाने के लिए सिफारिश करेंगे है नहीं कर रहा हूँ।

आपको लेआउट के साथ प्रयोग करना बहुत आसान लगेगा और इस तरह से आगे बढ़ेगा, और यह स्वचालित रूप से यूआई से संबंधित सामानों को आपके शेष एप्लिकेशन तर्क से अलग रखेगा। मुख्य खिड़की के लिए, और किसी भी संवाद बॉक्स के लिए, हालांकि यह सरल है।

फिर pyuic4 का उपयोग ui फ़ाइलों से पाइथन मॉड्यूल को संकलित करने के लिए करें, और उन्हें अपने स्वयं के उप-पैकेज में एक साथ रखें।

ui फ़ाइलों को संकलित करते समय मैं -w ध्वज का उपयोग करने की अनुशंसा करता हूं। यह एक साधारण रैपर यूआई कक्षा उत्पन्न करेगा जिसे सीधे उपclassed किया जा सकता है।

तो अपने मुख्य विंडो कुछ इस तरह लग रही अंत होगा:

from ui.mainwindow import MainWindowUI 

class MainWindow(MainWindowUI): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     # connect signals... 
     # do other setup stuff... 

ध्यान दें कि सभी विजेट क्यूटी डिजाइनर में जोड़ा MainWindow उदाहरण की विशेषताओं के रूप में सीधे पहुँचा जा सकता अब कर रहे हैं।

मैं बाद में विकास में अपने आवेदन को छोटे मॉड्यूल में तोड़ने की चिंता नहीं करता।यह आवश्यक नहीं हो सकता है - लेकिन यदि ऐसा होता है, तो यह अधिक स्पष्ट हो जाएगा कि एप्लिकेशन को और अधिक जटिल होने के बाद यह कैसे करना है।

कोई कठोर और तेज़ नियम नहीं हैं - प्रत्येक परियोजना अलग है।

+1

मैं क्यूटी डिजाइनर का उपयोग करता था, लेकिन मुझे इसके जेनरेट कोड को पसंद नहीं आया, यह भयानक लग रहा है और बाद में इसे बदलना मुश्किल है, यह भी बहुत कचरा जोड़ता है जिसकी मुझे ज़रूरत नहीं है। यही कारण है कि मैंने खुद को खरोंच से यूआई लिखना शुरू कर दिया। इस तरह मैं कोड की हर पंक्ति को नियंत्रित करता हूं। हालांकि मुझे कुछ याद आ रहा है लेकिन मैं सीखूंगा। आपके जवाब के लिए धन्यवाद। – linuxoid

+5

@ user665327। आपने जेनरेट किए गए मॉड्यूल के उद्देश्य को पूरी तरह गलत समझा है। वे संपादन के लिए _meant_ नहीं हैं। वे केवल _importing_ के लिए हैं। मैं यह नहीं कहूंगा कि यूआई कोड लिखने में कुछ भी गलत है, लेकिन आप क्यूटी डिजाइनर का उपयोग नहीं कर रहे हैं। कम से कम, आपको इसे प्रयोग के लिए एक उपकरण के रूप में उपयोग करना चाहिए। और यहां तक ​​कि यदि आप 'pyuic' द्वारा उत्पन्न कोड का उपयोग नहीं करते हैं, तो भी आप यह देखकर _a lot_ सीख सकते हैं कि यह चीजें कैसे करता है (लेआउट प्रबंधन की बात आती है तो यह विशेष रूप से सच है)। – ekhumoro

8
import sys 
from PyQt4 import QtCore, QtGui 


class MainWindow(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.form_widget = FormWidget(self) 
     _widget = QtGui.QWidget() 
     _layout = QtGui.QVBoxLayout(_widget) 
     _layout.addWidget(self.form_widget) 
     self.setCentralWidget(_widget) 

class FormWidget(QtGui.QWidget): 

    def __init__(self, parent): 
     super(FormWidget, self).__init__(parent) 
     self.__controls() 
     self.__layout() 

    def __controls(self): 
     self.label = QtGui.QLabel("Name for backdrop") 
     self.txted = QtGui.QLineEdit() 
     self.lbled = QtGui.QLabel("Select a readNode") 
     self.cmbox = QtGui.QComboBox() 

    def __layout(self): 
     self.vbox = QtGui.QVBoxLayout() 
     self.hbox = QtGui.QHBoxLayout() 
     self.h2Box = QtGui.QHBoxLayout() 

     self.hbox.addWidget(self.label) 
     self.hbox.addWidget(self.txted) 

     self.h2Box.addWidget(self.lbled) 
     self.h2Box.addWidget(self.cmbox) 

     self.vbox.addLayout(self.hbox) 
     self.vbox.addLayout(self.h2Box) 
     self.setLayout(self.vbox) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    win = MainWindow() 
    win.show() 
    app.exec_() 

if __name__ == '__main__': 
    sys.exit(main()) 

सही तरीका !!!