如何使用注销按钮注销应用程序?

2024-06-30 13:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有身份验证页面的应用程序,然后是一个带有注销按钮的主页。当我按下logout按钮时,它会关闭页面并将我放入身份验证页面,因此它似乎工作正常。但是,当我再次这样做时,我无法再登录,身份验证页面被阻止

这是我的密码:

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.15
import QtQuick.Layouts 1.3
import "custom"




ApplicationWindow{
    id: windowApp
    //On expose notre stackview a tous les autres qml
    property alias stack: stackView

    width: 760
    height: 500
    minimumHeight: 500
    minimumWidth: 700
    visible: true
    title: qsTr("App Home")
    color:"#333333"

   
    CustomButton {
        id: logoutButton
        text: qsTr("Déconnexion")
        …
        onClicked: {
            logoutFunction()
            //stackView.push(Qt.resolvedUrl("pages/"+returnpath2))
        }

    }

        StackView{
        id:stackView
        anchors …… 
        initialItem: Qt.resolvedUrl("pages/accueil.qml")
    }



    function logoutFunction() {
        var component = Qt.createComponent("main.qml")
        var win2 = component.createObject()
        windowApp.destroy()
        win2.show()


    }
}


import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Controls.Material 2.15

ApplicationWindow{
    id: window 
    width: 400
    height: 550
    visible: true
    title: qsTr("Login Page")
    color: "#333333"

    // SET FLAGS
    flags: Qt.WindowCloseButtonHint | Qt.WindowMinimizeButtonHint | Qt.CustomizeWindowHint | Qt.MSWindowsFixedSizeDialogHint | Qt.WindowTitleHint

    // SET MATERIAL STYLE
    Material.theme: Material.System
    Material.accent: Material.Black

    // CREATE TOP BAR
    Rectangle{
        id: topBar
        height: 40
        color: Material.accentColor
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.top: parent.top
        anchors.rightMargin: 10
        anchors.leftMargin: 10
        anchors.topMargin: 30
        radius: 10

        Text{
            text: qsTr("Outil d'Analyse des trames IP des RX/TX 2G")
            font.capitalization: Font.AllUppercase //mettre en maj
            anchors.verticalCenter: parent.verticalCenter
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
            fontSizeMode: Text.HorizontalFit
            color: "#ffffff"
            anchors.horizontalCenter: parent.horizontalCenter
            font.pointSize: 15
        }
    }

    // IMAGE IMPORT
    Image{
        id: image 
        width: 300
        height: 120
        source: "../images/finland.jpeg"
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: topBar.bottom
        anchors.topMargin: 60
    }

    // TEXT FIELD USERNAME
    TextField{
        id: usernameField
        width: 300
        text: qsTr("")
        selectByMouse: true
        placeholderText: qsTr("Your username or email")
        verticalAlignment: Text.AlignVCenter        
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: image.bottom
        anchors.topMargin: 60
        onAccepted:{ //permet d'utiliser clavier entrée pour mdp
            console.log("TEST")
            backend.checkLogin(usernameField.text, passwordField.text)
        }
    }

    // TEXT FIELD USERNAME
    TextField{
        id: passwordField
        width: 300
        text: qsTr("")
        selectByMouse: true
        placeholderText: qsTr("Your password")
        verticalAlignment: Text.AlignVCenter        
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: usernameField.bottom
        anchors.topMargin: 10
        echoMode: TextInput.Password
        onAccepted:{ //permet d'utiliser clavier entrée pour mdp
            console.log("TEST2")
            backend.checkLogin(usernameField.text, passwordField.text)
        }
    }

    // BUTTON LOGIN
    Button{
        id: buttonLogin
        width: 300
        implicitHeight: 40
        text: qsTr("Login")
        anchors.top: passwordField.bottom
        anchors.topMargin: 40
        anchors.horizontalCenter: parent.horizontalCenter
        onClicked:
        {
            console.log("TEST3")
            backend.checkLogin(usernameField.text, passwordField.text)
        }
    }



    
    Connections {
        target: backend

        // CUSTOM PROPERTIES
        property string username: ""
        property string password: ""
        function onSignalUser(myUser){ username = myUser }
        function onSignalPass(myPass){ password = myPass }

        // FUNTION OPEN NEW WINDOW (APP WINDOW)
        function onSignalLogin(boolValue) {
            if(boolValue){
                var component = Qt.createComponent("app.qml")
                var win = component.createObject()
                window.close()
                win.show()


            } else{
                // CHANGE USER COLOR
                usernameField.Material.foreground = Material.Pink
                usernameField.Material.accent = Material.Pink
                passwordField.Material.foreground = Material.Pink
                passwordField.Material.accent = Material.Pink
            }
        }
    }    
}


import sys
import os

# IMPORT MODULES
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
from PySide2.QtCore import QObject, Slot, Signal

# Main Window Class
class MainWindow(QObject):
    def __init__(self):
        QObject.__init__(self)

    # Static Info
    staticUser = ""
    staticPass = ""

    # Signals To Send Data
    signalUser = Signal(str)
    signalPass = Signal(str)
    signalLogin = Signal(bool)

    # Function To Check Login
    @Slot(str, str)
    def checkLogin(self, getUser, getPass):
        if(self.staticUser.lower() == getUser.lower() and self.staticPass == getPass):
            # Send Login Signal
            self.signalLogin.emit(True)
            print("Login passed!")
        else:
            self.signalLogin.emit(False)
            print("Login error!")


# INSTACE CLASS
if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    # Get Context
    main = MainWindow()
    engine.rootContext().setContextProperty("backend", main)

    # Load QML File
    engine.load(os.path.join(os.path.dirname(__file__), "qml/main.qml"))

    # Check Exit App
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

Tags: textimportselfidqtqmlwidthparent
1条回答
网友
1楼 · 发布于 2024-06-30 13:25:00

您不必要地创建了许多信号,从而使应用程序复杂化,而不是在QML中创建只读的qproperty,那么该属性将指示您是否已登录,如果未登录,则应转到登录页面

├── main.py
└── qml
    ├── main.qml
    └── pages
        ├── index.qml
        └── login.qml

main.py

import os
from pathlib import Path
import sys

from PySide2.QtCore import Property, QObject, Signal, Slot
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine


class Controller(QObject):
    logged_changed = Signal(name="loggedChanged")
    _is_logged = False

    @Property(bool, notify=logged_changed)
    def logged(self):
        return self._is_logged

    def change_state(self, is_logged):
        if self._is_logged == is_logged:
            return
        self._is_logged = is_logged
        self.logged_changed.emit()

    @Slot(str, str)
    def login(self, username, password):
        self.change_state(username == "username" and password == "password")

    @Slot()
    def logout(self):
        self.change_state(False)


def main():
    app = QGuiApplication(sys.argv)

    controller = Controller()

    engine = QQmlApplicationEngine()
    engine.rootContext().setContextProperty("controller", controller)
    engine.load(os.fspath(Path(__file__).resolve().parent / "qml" / "main.qml"))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

main.qml

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    StackView {
        id: stackview
        anchors.fill: parent
        initialItem: Qt.resolvedUrl("pages/login.qml")
    }

    Connections{
        target: controller
        function onLoggedChanged(){
            if(controller.logged){
                stackview.pop()
                stackview.push("pages/index.qml")
            }
            else{
                stackview.pop()
                stackview.push("pages/login.qml")
            }
        }
    }

}

login.qml

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15

Item {
    ColumnLayout {
        anchors.centerIn: parent

        TextField {
            id: username

            placeholderText: "username"
        }

        TextField {
            id: password

            echoMode: TextInput.Password
            placeholderText: "password"
        }

        Button {
            id: login

            text: "Login"
            Layout.alignment: Qt.AlignCenter
            onClicked: controller.login(username.text, password.text)
        }

    }

}

索引.qml

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15

Item {
    Button {
        id: login

        text: "Logout"
        anchors.centerIn: parent
        onClicked: controller.logout()
    }

}

相关问题 更多 >