2012-11-25 18 views
6

में सेंट्रलविजेट को बदलें मैं पाइसाइड के लिए नया हूं। मेरे पास एक मुख्य विंडो ऑब्जेक्ट है जो एक समय में एक विजेट दिखाता है। बटन दबाते समय विंडो में दृश्यमान विजेट को प्रतिस्थापित करने के लिए मैं QMainWindow कक्षा के केंद्रीय विजेट को बदलने की कोशिश कर रहा हूं। समस्या यह है कि दबाया गया बटन विजेट क्लास में है, मुख्य विंडो वर्ग में नहीं।मेनविंडो

कहते हैं ...

class App(QtGui.QMainWindow): 

    def __init__(self): 
     super(App, self).__init__() 

     self.initUI() 

    def initUI(self): 

     self.statusBar().showMessage('Listo.') #Status Bar 
     self.login_screen = LoginScreen() 
     self.logged_in_screen = LoggedInScreen() 

     self.setCentralWidget(self.login_screen) 

     self.setGeometry(300, 300, 450, 600) #Window Size 
     self.setWindowTitle('PyTransactio - Client') #Window Title 
     self.setWindowIcon(QtGui.QIcon('icon.png')) #App Icon 
     self.show() 

दबाया बटन login_screen उदाहरण में है। विधि बटन क्लिक होने बुलाया LoginScreen वर्ग के भीतर है:

def login(self): 
     """ Send login data to the server in order to log in """ 

     #Process 

     self.setParent(None) 

None को माता-पिता विजेट की स्थापना मुख्य विंडो से विजेट (login_screen) को हटा। loginButton (login_screen विजेट के अंदर) जब कोई अन्य विजेट (उदाहरण के लिए logged_in_screen) मुख्य विंडो के केंद्रीय विजेट के रूप में मुझे क्या करना चाहिए?

शायद लॉगिन विधि मुख्य विंडो कक्षा के अंदर होनी चाहिए? यदि हां, तो मैं मुख्य विंडो की विधि के साथ login_screen में दबाए गए बटन को कैसे कनेक्ट कर सकता हूं?

उत्तर

10

आप केंद्रीय विजेट के रूप में QStackedWidget का उपयोग कर सकते हैं और इसमें लॉग-इन स्क्रीन और "लॉग-इन" स्क्रीन दोनों जोड़ सकते हैं।

एक उदाहरण उपयोग:

from PyQt4 import QtCore, QtGui 


class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.central_widget = QtGui.QStackedWidget() 
     self.setCentralWidget(self.central_widget) 
     login_widget = LoginWidget(self) 
     login_widget.button.clicked.connect(self.login) 
     self.central_widget.addWidget(login_widget) 
    def login(self): 
     logged_in_widget = LoggedWidget(self) 
     self.central_widget.addWidget(logged_in_widget) 
     self.central_widget.setCurrentWidget(logged_in_widget) 


class LoginWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(LoginWidget, self).__init__(parent) 
     layout = QtGui.QHBoxLayout() 
     self.button = QtGui.QPushButton('Login') 
     layout.addWidget(self.button) 
     self.setLayout(layout) 
     # you might want to do self.button.click.connect(self.parent().login) here 


class LoggedWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(LoggedWidget, self).__init__(parent) 
     layout = QtGui.QHBoxLayout() 
     self.label = QtGui.QLabel('logged in!') 
     layout.addWidget(self.label) 
     self.setLayout(layout) 



if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    window.show() 
    app.exec_() 

आप इस विजेट का उपयोग नहीं करना चाहते हैं, तो मुझे लगता है कि आप QMainWindow.setCentralWidget आप केंद्रीय विजेट बदल हर बार फोन करना होगा।

जहां login विधि होनी चाहिए, यह निर्भर करता है। शायद आप अपने मुख्यविंडो के लिए विशिष्ट केंद्रीय विजेट जोड़ने/निकालने/दिखाने के लिए एक सरल इंटरफ़ेस परिभाषित कर सकते हैं, और इसे loginLoginScreen की विधि से कॉल करें। इस तरह LoginScreen कक्षा को कार्यान्वयन विवरणों के बारे में पता नहीं है जैसे कि केंद्रीय विजेट वास्तव में QStackedWidget है या यह बात किसी अन्य तरीके से की जाती है।

+1

** QStackedWidget ** काम किया। इसके अलावा, मैंने कभी भी 'self.parent() लॉगिन' के बारे में सोचा नहीं। मुझे लगता है कि मुझे अपने ओओपी पर काम करना होगा। आपका बहुत बहुत धन्यवाद! –

+0

केंद्रीय विजेट के रूप में सेटिंग करते समय, QMainWindow उस विजेट का स्वामित्व लेता है। केंद्रीय विजेट के रूप में अन्य विजेट को सेट करते समय, पहला नष्ट हो जाता है, जो खराब है। –

+0

@HrvojeT हां, यही कारण है कि मेरा उत्तर 'QStackedWidget' का उपयोग करता है और वह हैक नहीं, जिसे शायद कुछ बदसूरत कोड ठीक से काम करने की आवश्यकता होती है। – Bakuriu

-2

आप इस (बार-बार) करने के लिए QMainWindow.setCentralWidget उपयोग कर सकते हैं:

#! /usr/bin/env python3 

from PySide import QtGui 
from PySide import QtCore 

import sys 

app = QtGui.QApplication(sys.argv) 
mw = QtGui.QMainWindow() 
w2 = QtGui.QWidget() 
pb = QtGui.QPushButton('push me', w2) 

l1 = QtGui.QLabel('orig') 
l2 = QtGui.QLabel('changed') 
mw.setCentralWidget(l1) 
pb.clicked.connect(lambda: mw.setCentralWidget(l2)) 
mw.show() 
w2.show() 
sys.exit(app.exec_()) 
+0

मुझे पता है कि यह एक संभावित कामकाज है, लेकिन अंतिम केंद्रीय_विजेट को नष्ट करना एक भयानक साइड इफेक्ट है ... –