Как общаться или переключаться между двумя окнами в PyQt? - PullRequest
2 голосов
/ 13 марта 2012

Я занимаюсь разработкой приложения с использованием Python и Qt.

Я спроектировал 2 главных окна, т. Е. QMainWindow (не QWidget или QDialog), используя Qt.

Пусть будет так.

1.LoginWindow - LoginUI (Qt)

2.StuffWindow --- StuffUI

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

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

  3. Должно быть показано StaffWindow и LoginWindow должно быть закрыто ..

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

Ответы [ 5 ]

4 голосов
/ 13 марта 2012

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

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

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

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 голосов
/ 25 октября 2014

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

self.password.setEchoMode(QtGui.QLineEdit.Password)
3 голосов
/ 13 марта 2012

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

  • LoginWindow должно быть QDialog, запущенным как МОДАЛЬНОЕ.
  • Проверьте возврат 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 голосов
/ 04 июля 2019

для соответствия имени пользователя и пароля.

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

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.username.text()) == "foo" and str(self.password.text()) == "bar": # do actual login check
            self.accept()
        else:
            QMessageBox.warning(
                self, 'Error', 'Bad user or password')
            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("%s%s%s" % ("Username entered: ", self.username, "\npassword ok!"))


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_())
0 голосов
/ 04 декабря 2017

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

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

# Ref to this OP question. /7963471/kak-obschatsya-ili-pereklychatsya-mezhdu-dvumya-oknami-v-pyqt

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_())
...