如何解决如何使用 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")
}
}
}
}
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)
}
}
}
index.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()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。