如何使用logoutButton注销应用程序



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

这是我的代码:

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

您创建了许多不必要的信号,而不是在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")
}
}
}
}

登录.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()
}
}

最新更新