2012-03-13 2 views
2

Я разрабатываю приложение с использованием python и Qt.Как общаться или переключаться между двумя окнами в PyQt?

Я разработал 2 главных окна ie..QMainWindow (не QWidget или QDialog) с использованием Qt.

Да будет так.

1.LoginWindow - LoginUI (Qt)

2.StuffWindow --- StuffUI

  1. Сначала я должен отобразить Окно входа в систему.

  2. Тогда я должен передать имя пользователя StaffWindow (имя пользователя, необходимые для управления питания)

  3. StaffWindow должны быть показаны и Должно быть пользователя появляется Closed ..

Как я могу добиться этого ..? Помоги мне ..

ответ

4

Независимо от вашего описания, я думаю, что ваше должна быть пользователем появляется QDialog, и ваш StuffWIndow быть MainWindow, и функция, как это ...

  1. Вашего StuffWindow MainWindow должен быть создан (не показаны)
  2. Вызов метода login(), который создает и exec_() ваш логин QDialog как модальный приложения диалогового
  3. Запуск app.exec_() цикл событий в настоящее время, и ждать, пока пользователь взаимодействует с логином
  4. пользователя взаимодействует с login dialo g, и результат закрытия диалогового окна позволит вашему приложению проверить его значения и отобразить его основной интерфейс.

Вот краткий набросок:

class MainWindow(): 

    def login(): 
     loginDialog = LoginDialog() 

     # this is modal. wait for it to close 
     if loginDialog.exec_(): 
      # dialog was accepted. check its values and maybe: 
      self.show() 

     else: 
      # maybe reshow the login dialog if they rejected it? 
      loginDialog.exec_() 


if __name__ == "__main__": 

    app = QApp 
    win = MainWindow() 
    win.login() 
    app.exec_() 
3

я согласен большинство точек jdi поднятым, но я предпочитаю несколько иной подход.

  • LoginWindow должно быть QDialog начато как MODAL.
  • Проверьте возврат exec_() (т. Е. accept/reject) для входа или отмены/выхода.
  • Проверьте вход внутри LoginWindow
  • Если успешно Логин, запустить MainWindow с параметрами, поставляемого

Я начал кодирование простого примера, прежде чем увидеть ответ Jdi в. Я мог бы также сказать это здесь.

import sys 
from PyQt4 import QtGui, QtCore 

class LoginDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(LoginDialog, self).__init__(parent) 

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

     self.buttons = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) 
     self.buttons.accepted.connect(self.check) 
     self.buttons.rejected.connect(self.reject) 

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

    def check(self): 
     if str(self.password.text()) == "12345": # do actual login check 
      self.accept() 
     else: 
      pass # or inform the user about bad username/password 


class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

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

    def setUsername(self, username): 
     # do whatever you want with the 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_(): # 'reject': user pressed 'Cancel', so quit 
     sys.exit(-1)  

    # 'accept': continue 
    main = MainWindow() 
    main.setUsername(login.username.text()) # get the username, and supply it to main window 
    main.show() 

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

Да это почти точно такой же подход, как у меня, за исключением того, что вы перемещаете логики в __main__ вместо того, чтобы позволить MainWindow управлять им. Каждый способ работает хорошо. – jdi

2

Хотя это не имеет прямого отношения к вашему вопросу, вы всегда должны установить QLineEdit.EchoMode для поля ввода пароля следующим образом (см here):

self.password.setEchoMode(QtGui.QLineEdit.Password) 
+0

действительно немного не по теме, но 100% по теме в «Я забыл установить это значение» -list. – ZF007

0

Это PyQt5 обновленную версию Авариса. Некоторые обработки исключений были добавлены, чтобы показать, как поймать несколько ошибок (при кодировании вашей вещи. Наслаждайтесь!

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

# Ref to this OP question. https://stackoverflow.com/questions/9689053/how-to-communicate-or-switch-between-two-windows-in-pyqt4 

import sys 
from PyQt5 import QtGui, QtCore, QtWidgets 
from PyQt5.QtWidgets import QApplication, QDialog, QDialogButtonBox, QFormLayout, QLabel, QLineEdit, QWidget, QVBoxLayout 

class LoginDialog(QtWidgets.QDialog): 
    def __init__(self, parent=None): 
     super(LoginDialog, self).__init__(parent) 

     self.username = QLineEdit() 
     self.password = QLineEdit() 
     loginLayout = QFormLayout() 
     loginLayout.addRow("Username", self.username) 
     loginLayout.addRow("Password", self.password) 

     self.buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) 
     self.buttons.accepted.connect(self.check) 
     self.buttons.rejected.connect(self.reject) 

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

    def check(self): 
     if str(self.password.text()) == "12345": # do actual login check 
      self.accept() 
     else: 
      pass # or inform the user about bad username/password 

    def my_exception_hook(exctype, value, traceback): 
     # Print the error and traceback 
     print(exctype, value, traceback) 
     # Call the normal Exception hook after 
     sys._excepthook(exctype, value, traceback) 
     sys.exit(1) 

    # Back up the reference to the exceptionhook 
    sys._excepthook = sys.excepthook 

    # Set the exception hook to our wrapping function 
    sys.excepthook = my_exception_hook 


class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

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

    def setUsername(self, username): 
     # do whatever you want with the username 
     self.username = username 
     self.label.setText("Username entered: %s" % self.username) 


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

    login = LoginDialog() 
    if not login.exec_(): # 'reject': user pressed 'Cancel', so quit 
     sys.exit(-1)  # instead of -1 another action can be triggered here.  

    # 'accept': continue 
    main = MainWindow() 

    # get the username, and supply it to main window 
    main.setUsername(login.username.text()) 
    main.show() 

    sys.exit(app.exec_()) 
Смежные вопросы