2016-04-29 5 views
0

Es gibt zwei Klassen für zwei Fenster. Nach erfolgreicher Anmeldung sollte MainWindow gestartet werden. Code kann MainWindow starten. Es werden jedoch keine Widgets angezeigt. Es gibt zwei Kategorien von Benutzern: 1) admin 2) Andere Benutzer Ich möchte zwei verschiedene Fenster für Admin und andere Benutzer anzeigen. Wie behebt man das obige Problem?Nach dem erfolgreichen Anmelden können keine Widgets im zweiten Fenster angezeigt werden. Python und PyQt4

from PyQt4 import QtGui 
import sys 

class LoginDialog(QtGui.QDialog): 
    '''This is login window class''' 
    def __init__(self): 
     super().__init__() 

     self.username = QtGui.QLineEdit() 
     self.password = QtGui.QLineEdit() 

     self.login = QtGui.QPushButton('Login') 
     self.reset = QtGui.QPushButton('Reset') 

     loginLayout = QtGui.QFormLayout() 
     loginLayout.addRow("Username", self.username) 
     loginLayout.addRow("Password", self.password) 
     loginLayout.addRow(self.login, self.reset) 

     self.login.clicked.connect(self.onlogin) 
     self.reset.clicked.connect(self.onreset) 
     self.setGeometry(200,200,500,300) 
     self.setWindowTitle('test') 
     self.setWindowIcon(QtGui.QIcon('pythonlogo.png')) 

##  layout = QtGui.QVBoxLayout() 
## 
##  layout.addLayout(loginLayout) 
##  layout.addWidget(self.buttons) 
     self.setLayout(loginLayout) 
     self.show() 

    def onlogin(self): 
     ''''When login button is pressed ''' 
     uname = str(self.username.text()) 
     pwd = str(self.password.text()) 
     if uname == 'admin' and pwd == 'someone': 
      self.accept() 
     else: 
      QtGui.QMessageBox.warning(self, 'Error', 'incorrect cred') 

    def onreset(self): 
     '''When reset button is called ''' 
     self.username.setText('') 
     self.password.setText('') 

class MainWindow(QtGui.QMainWindow): 
    '''This is main window class''' 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.setGeometry(200,200,500,300) 
     self.home() 
     # print('yetotofnck nkdfnk') 

     # self.label = QtGui.QLabel() 
     # self.setCentralWidget(self.label) 

     self.searchbar = QtGui.QLineEdit() 
     self.searchbtn = QtGui.QPushButton('Search') 
     self.logoutbtn = QtGui.QPushButton('Logout') 

     self.searchbtn.clicked.connect(self.onsearch) 
     self.logoutbtn.clicked.connect(self.onlogout) 


     self.layout = QtGui.QFormLayout() 
     self.layout.addRow(self.searchbar, self.searchbtn) 
     self.layout.addRow(self.logoutbtn) 

##  wlayout = QtGui.QVBoxLayout() 
##  wlayout.addLayout(layout) 
     self.setLayout(self.layout) 

    def home(self): 

     btn = QtGui.QPushButton('Logout') 
     btn.clicked.connect(self.close_app) 
     self.show() 

    def close_app(self): 

     sys.exit(-1) 

    def onsearch(self): 
     print('serach successful') 

    def onlogout(self): 
     pass 

    def setusername(self, username): 
     self.username = username 
     self.label.setText("Username entered:%s"%self.username) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 

    login = LoginDialog() 

    if not login.exec_(): 
     sys.exit(-1) 

    main = MainWindow() 
    main.home() 
## main.setusername(login.username.text()) 
## main.show() 

    sys.exit(app.exec_()) 
+0

http://stackoverflow.com/questions/9689053/how-to-communicate-or-switch-between-two-windows-in-pyqt4. Ich habe Hilfe von diesem Beitrag genommen, um obigen Code zu schreiben. – Rudra

Antwort

0

QMainWindow ist ein spezialisiertes Fenster, das sein eigenes Layout standardmäßig hat, so dass Sie eine Warnung sehen werden sollen:

QWidget :: setLayout: Der Versuch, QLayout zu setzen "" auf Mainwindow "", , die bereits ein Layout

Siehe QMainWindow docs für eine Beschreibung des Layouts hat.

Wenn Sie eine Formlayout verwenden mögen, dann einen QWidget als Hauptfenster verwenden:

Ein Widget, das nicht in einem übergeordneten Widget eingebettet ist, heißt ein Fenster

Siehe QWidget docs .

Hier ist ein Beispiel:

Auf OSX 10.10.5 mit Qt 4.8.6, PyQt 4.11.4 und Python 2.7, unter dem Code erzeugt die Warnung:

modalSession wurde vorzeitig beendet - prüfen, ob ein Reentry Anruf zu endModalSession:

Apparen Das ist ein Fehler. Siehe https://bugreports.qt.io/browse/QTBUG-37699. Mit Qt 5.6.0, PyQt 5.5.1, python3.4 sehe ich diese Warnung nicht.

from PyQt4.QtGui import (QMainWindow, QDialog, QApplication, 
     QLineEdit, QPushButton, QFormLayout, QMessageBox, QWidget) 
#from PyQt5.QtWidgets import (QMainWindow, QDialog, QApplication, 
#  QLineEdit, QPushButton, QFormLayout, QMessageBox, QWidget) 

from PyQt4.QtCore import pyqtSignal 
#from PyQt5.QtCore import pyqtSignal 
import sys 

class LoginDialog(QDialog): 

    loginSignal = pyqtSignal(str, str) #Create a custom signal, which you can use 
             #to send two string arguments to a connected function. 

    def __init__(self, mainWindow): 
     super(LoginDialog, self).__init__() 

     self.setGeometry(200,200,500,300) 
     self.setWindowTitle('Login') 

     self.usernameInput = QLineEdit() 
     self.passwordInput = QLineEdit() 
     self.loginButton = QPushButton('Login') 
     self.resetButton = QPushButton('Reset') 

     #*****> CONNECT BUTTON TO A FUNCTION THAT EMITS CUSTOM SIGNAL <***** 
     self.loginButton.clicked.connect(self.emitLoginSignal) 
     self.resetButton.clicked.connect(self.onclickReset) 

     loginLayout = QFormLayout() 
     loginLayout.addRow("Username", self.usernameInput) 
     loginLayout.addRow("Password", self.passwordInput) 
     loginLayout.addRow(self.loginButton, self.resetButton) 
     self.setLayout(loginLayout) 

    def emitLoginSignal(self): 
     #***> EMIT CUSTOM SIGNAL <**** 
     self.loginSignal.emit(
      self.usernameInput.text(), 
      self.passwordInput.text() 
     ) 


    def onclickReset(self): 
     pass 


class MyAdminWindow(QWidget): 

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

     self.setGeometry(200,200,500,300) 
     self.setWindowTitle("MainWindow") 

     self.searchbar = QLineEdit() 
     self.searchbtn = QPushButton('Search') 
     self.logoutbtn = QPushButton('Logout') 

     self.searchbtn.clicked.connect(self.onsearch) 
     self.logoutbtn.clicked.connect(self.onlogout) 

     formLayout = QFormLayout() 
     formLayout.addRow(self.searchbar, self.searchbtn) 
     formLayout.addRow(self.logoutbtn) 
     self.setLayout(formLayout) 

     self.loginDialog = LoginDialog(self) 
     #*****> CONNECT TO CUSTOM SIGNAL HERE: <******* 
     self.loginDialog.loginSignal.connect(self.validateUser) 
     self.loginDialog.exec_() 

    def onsearch(self): 
     pass 
    def onlogout(self): 
     pass 


    def validateUser(self, username, password): 
     if username == 'admin' and password == 'someone': 
      self.loginDialog.close() 
      self.show() #Now show the window. 
     else: 
      QMessageBox.warning(self, 'Error', 'incorrect cred') 


app = QApplication([]) 
window = MyAdminWindow() 
#Don't show() the window 
sys.exit(app.exec_()) 
+0

Implementierte Änderung von 7stud vorgeschlagen und es funktioniert gut. Danke vielmals!! – Rudra

Verwandte Themen