2017-09-25 5 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

方法は、現在のウィジェット(doc)への参照を削除setCentralWidgetので、これが起こっています。ですから、あなたが再度見せようとすると、あなたのPythonリファレンスself.loginは、削除されたものを参照します。

回避策があります:(これは参照を保持するためのプログラムを強制されます)ちょうど新しい中央ウィジェットを設定する前に、現在の中央ウィジェットにNone親を割り当てる:self.regについては

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

多分あなたが好むでしょうユーザーがボタン・レジスターを再度クリックすると、フォームを削除して新しいフォームを再作成しますか?

+0

はい。ご協力ありがとうございます。出来た! –

+0

ニース!このリンクは、PyQt内でこの種の問題についてもっと知りたい場合には興味深いです:[PyQt。足で自分を撃つ方法](http://enki-editor.org/2014/08/23/Pyqt_mem_mgmt.html) – PRMoureu

関連する問題