2017-09-25 67 views
1

在我的代码中,我有2个小部件和1个主窗口。当我的程序开始时,主窗口的中心部件是“登录”。我希望当我点击注册(登录小工具的标签),reg小部件打开。我这样做,但后来我点击登录(注册的小部件的标签)相同的想法不发生。对不起英语不好。点击标签时如何打开小部件

import sys 
import os 
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QMainWindow 
from PyQt5 import QtGui 
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 

class main(QMainWindow): 

    def __init__(self): 

     super().__init__() 
     self.login = login() 
     self.reg = reg() 
     self.setCentralWidget(self.login) 
     self.setWindowTitle("Main") 
     self.init_ui() 

    def init_ui(self): 

     self.login.label_4.mousePressEvent = self.click 
     self.show() 

    def click(self,event): 

     if event: 
      self.setCentralWidget(self.reg) 
      self.reg.label_4.mousePressEvent = self.click_2 

    def click_2(self,event): 

     if event: 
      self.setCentralWidget(self.login) 
      self.login.label_4.mousePressEvent = self.click 

class login(QWidget): 

    def __init__(self): 

     super().__init__() 
     self.init_ui() 

    def init_ui(self): 
     self.label_1 = QLabel("Login:  ") 
     self.line_1 = QLineEdit() 
     self.h_box = QHBoxLayout() 
     self.h_box.addWidget(self.label_1) 
     self.h_box.addWidget(self.line_1) 

     self.label_2 = QLabel("Password:") 
     self.line_2 = QLineEdit() 
     self.line_2.setEchoMode(QLineEdit.Password) 
     self.h_box2 = QHBoxLayout() 
     self.h_box2.addWidget(self.label_2) 
     self.h_box2.addWidget(self.line_2) 

     self.buton_1 = QPushButton("Login") 

     self.label_4 = QLabel("Register") 
     self.label_4.setStyleSheet("color : blue") 
     self.label_4.setAlignment(Qt.AlignCenter) 

     self.v_box = QVBoxLayout() 
     self.v_box.addLayout(self.h_box) 
     self.v_box.addLayout(self.h_box2) 
     self.v_box.addWidget(self.buton_1) 
     self.v_box.addWidget(self.label_4) 

     self.setLayout(self.v_box) 

class reg(QWidget): 

    def __init__(self): 

     super().__init__() 
     self.init_ui() 

    def init_ui(self): 

     self.label_1 = QLabel("Login:     ") 
     self.line_1 = QLineEdit() 
     self.h_box1 = QHBoxLayout() 
     self.h_box1.addWidget(self.label_1) 
     self.h_box1.addWidget(self.line_1) 

     self.label_2 = QLabel("Password    ") 
     self.line_2 = QLineEdit() 
     self.line_2.setEchoMode(QLineEdit.Password) 
     self.line_2.resize(300,300) 
     self.h_box2 = QHBoxLayout() 
     self.h_box2.addWidget(self.label_2) 
     self.h_box2.addWidget(self.line_2) 

     self.label_3 = QLabel("Retype password:") 
     self.line_3 = QLineEdit() 
     self.line_3.setEchoMode(QLineEdit.Password) 
     self.h_box3 = QHBoxLayout() 
     self.h_box3.addWidget(self.label_3) 
     self.h_box3.addWidget(self.line_3) 

     self.buton_1 = QPushButton("Register") 
     self.label_4 = QLabel("Login") 
     self.label_4.setAlignment(Qt.AlignCenter) 
     self.label_4.setStyleSheet('color: blue') 

     self.v_box = QVBoxLayout() 
     self.v_box.addLayout(self.h_box1) 
     self.v_box.addLayout(self.h_box2) 
     self.v_box.addLayout(self.h_box3) 
     self.v_box.addWidget(self.buton_1) 
     self.v_box.addWidget(self.label_4) 
     self.setLayout(self.v_box) 

     self.setWindowTitle("Login") 


app = QApplication(sys.argv) 
main_window = main() 
sys.exit(app.exec_())` 

回答

0

发生这种情况,因为该方法setCentralWidget删除参考当前插件(doc)。因此,当您尝试再次显示时,您的Python参考self.login指的是已删除的内容。

有一种变通方法:

self.centralWidget().setParent(None) 
self.setCentralWidget(self.reg) 

self.reg也许你会喜欢:分配None父当前中央部件只设置一个新的中央部件(这将迫使程序保持基准)前删除表单并重新创建一个新的,如果用户再次点击按钮注册?

+0

是的。谢谢你的帮助。有效! –

+0

不错!这个链接很有趣,如果你想在PyQt中更多地了解这类问题:[PyQt。如何在脚下拍摄自己](http://enki-editor.org/2014/08/23/Pyqt_mem_mgmt.html) – PRMoureu

相关问题