2012-11-22 12 views
6

मैं python3 और Qt4 का उपयोग कर किसी मौजूदा विंडो से एक नई विंडो को कॉल करने का प्रयास कर रहा हूं।मौजूदा विंडो से नई PyQt4 विंडो कैसे बनाएं?

मैंने क्यूटी डिजाइनर (मुख्य एप्लिकेशन और दूसरा एक) का उपयोग करके दो खिड़कियां बनाई हैं, और मैंने क्यूटी डिजाइनर द्वारा जेपी स्क्रिप्ट में जेनरेट की गई .ui फ़ाइलों को परिवर्तित कर दिया है - लेकिन मैं नई विंडो नहीं बना सकता मुख्य आवेदन से।

मैं यह कर की कोशिश की:

############### MAIN APPLICATION SCRIPT ################ 

from PyQt4 import QtCore, QtGui 
import v2 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    _fromUtf8 = lambda s: s 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(194, 101) 
     self.button1 = QtGui.QPushButton(Form) 
     self.button1.setGeometry(QtCore.QRect(50, 30, 99, 23)) 
     self.button1.setObjectName(_fromUtf8("button1")) 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8)) 
     self.button1.setText(QtGui.QApplication.translate("Form", "Ventana", None, QtGui.QApplication.UnicodeUTF8)) 

     self.button1.connect(self.button1, QtCore.SIGNAL(_fromUtf8("clicked()")), self.mbutton1) 

    def mbutton1(self): 
     v2.main() 



if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Form = QtGui.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 
################## SECOND WINDOW ####################### 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    _fromUtf8 = lambda s: s 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(400, 300) 
     self.label = QtGui.QLabel(Form) 
     self.label.setGeometry(QtCore.QRect(160, 40, 57, 14)) 
     self.label.setObjectName(_fromUtf8("label")) 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8)) 
     self.label.setText(QtGui.QApplication.translate("Form", "LABEL 2", None, QtGui.QApplication.UnicodeUTF8)) 

def main(): 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Form = QtGui.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

लेकिन मैं इस त्रुटि संदेश मिलता है:

QCoreApplication::exec: The event loop is already running 
QPixmap: Must construct a QApplication before a QPaintDevice 

उत्तर

12

हालांकि pyuic-x, --execute विकल्प के साथ निष्पादन योग्य स्क्रिप्ट बना सकता है, यह मुख्य रूप से परीक्षण के लिए है।

pyuic का मुख्य उद्देश्य क्यूटी Desgner ui फ़ाइलें है कि आपके आवेदन में आयात निहित जीयूआई वर्गों के लिए आप की अनुमति देने से स्थिर अजगर मॉड्यूल तैयार करना है।

मान लीजिए कि आपने क्यूटी डिजाइनर का उपयोग करके दो ui फाइलें बनाई हैं और उन्हें v1.ui और v2.ui नाम दिया है।

फिर आप इस तरह दो अजगर मॉड्यूल बना होगा:

pyuic4 -o v1.py v1.ui 
pyuic4 -o v2.py v2.ui 

इसके बाद, आप एक अलग main.py स्क्रिप्ट मॉड्यूल से जीयूआई वर्गों का आयात करता है, और आवश्यकतानुसार उनमें से उदाहरणों बनाता लिखेंगे।

from PyQt4 import QtGui 
from v1 import Ui_Form1 
from v2 import Ui_Form2 

class Form1(QtGui.QWidget, Ui_Form1): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 
     self.button1.clicked.connect(self.handleButton) 
     self.window2 = None 

    def handleButton(self): 
     if self.window2 is None: 
      self.window2 = Form2(self) 
     self.window2.show() 

class Form2(QtGui.QWidget, Ui_Form2): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Form1() 
    window.show() 
    sys.exit(app.exec_()) 

ध्यान दें कि मैं थोड़ा अपने GUI क्लासों के नाम बदल गए हैं नाम स्थान संघर्ष से बचने के लिए:

तो अपने main.py कुछ इस तरह दिखाई सकता है। जीयूआई कक्षाओं को बेहतर नाम देने के लिए, क्यूटी डिस्नेर में शीर्ष-स्तरीय कक्षा की objectName संपत्ति सेट करें। और अपने परिवर्तन करने के बाद pyuic को फिर से चलाने के लिए मत भूलना!

5

आप केवल एक ही QApplication बना सकते हैं। इसे बनाने के बाद आप बना सकते हैं कि आप कितनी खिड़कियां चाहते हैं।

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

from PyQt4 import QtGui, QtCore 

class MyWindow(QtGui.QDialog): # any super class is okay 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 
     self.button = QtGui.QPushButton('Press') 
     layout = QtGui.QHBoxLayout() 
     layout.addWidget(self.button) 
     self.setLayout(layout) 
     self.button.clicked.connect(self.create_child) 
    def create_child(self): 
     # here put the code that creates the new window and shows it. 
     child = MyWindow(self) 
     child.show() 


if __name__ == '__main__': 
    # QApplication created only here. 
    app = QtGui.QApplication([]) 
    window = MyWindow() 
    window.show() 
    app.exec_() 

हर बार जब आप बटन पर क्लिक करें एक नई विंडो का निर्माण करेगा।

आप डिज़ाइनर के साथ बनाई गई विंडो का उपयोग करने के लिए उपरोक्त उदाहरण को अनुकूलित कर सकते हैं।

एक तरफ ध्यान दें पर:

कभी कभी pyuic का परिणाम संपादित करें। उन फ़ाइलों को बदला नहीं जाना चाहिए। इसका अर्थ है: पर mbutton1 विधि जोड़ें।

आप फ़ाइल mywindow_ui.py कि pyuic द्वारा बनाया गया था, तो आप फ़ाइल mywindow.py बना सकते हैं और कुछ इस तरह से रख: अपने मुख्य फ़ाइल से अब

from PyQt4 import QtCore, QtGui 
from mywindow_ui import Ui_MyWindow 

class MyWindow(QtGui.QWidget, Ui_MyWindow): #or whatever Q*class it is 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 
     self.setupUi(self) 
    def create_child(self): #here should go your mbutton1 
     # stuff 
#etc. 

main.py आप करते हैं:

from PyQt4 import QtGui 

from mywindow import MyWindow 


# ... 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = MyWindow() 
    window.show() 
    app.exec_() 
संबंधित मुद्दे