2

Python と Qt を使用してアプリケーションを開発しています。

Qtを使用して2つのメインウィンドウ、つまりQMainWindow(QWidgetまたはQDialogではない)を設計しました。

なるがままに。

1.LoginWindow -- ログインUI(Qt)

2.StuffWindow --- スタッフUI

  1. まず、ログイン ウィンドウを表示する必要があります。

  2. 次に、ユーザー名を StaffWindow に渡す必要があります (スタッフの管理に必要なユーザー名)

  3. StaffWindow を表示し、LoginWindow を閉じる必要があります。

どうすればこれを達成できますか..? 助けて..

4

5 に答える 5

4

私はjdiが提起した点のほとんどに同意しますが、少し異なるアプローチを好みます。

  • LoginWindowQDialogMODAL として開始する必要があります。
  • ログインまたはキャンセル/終了の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_())
于 2012-03-13T19:22:28.557 に答える
4

あなたの説明に関係なく、LoginWindow は QDialog で、StuffWIndow は MainWindow で、このように機能すると思います...

  1. StuffWindow MainWindow が作成されます (表示されていません)。
  2. login()ログイン QDialog をアプリケーションの MODAL ダイアログとして作成し、exec_() メソッドを呼び出す
  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_()
于 2012-03-13T18:28:45.957 に答える
3

これはあなたの質問とは直接関係ありませんが、常に次のようにパスワード フィールドに QLineEdit.EchoMode を設定する必要があります (こちらを参照)。

self.password.setEchoMode(QtGui.QLineEdit.Password)
于 2014-10-25T14:16:23.240 に答える