Python 如何使用注销按钮注销应用程序?
我有一个带有身份验证页面的应用程序,然后是一个带有注销按钮的主页。当我按下logout按钮时,它会关闭页面并将我放入身份验证页面,因此它似乎工作正常。但是,当我再次这样做时,我无法再登录,身份验证页面被阻止 这是我的密码:Python 如何使用注销按钮注销应用程序?,python,button,qml,logout,pyside2,Python,Button,Qml,Logout,Pyside2,我有一个带有身份验证页面的应用程序,然后是一个带有注销按钮的主页。当我按下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
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()
}
}
您不必要地创建了许多信号,从而使应用程序复杂化,而不是在QML中创建只读的qproperty,那么该属性将指示您是否已登录,如果未登录,则应转到登录页面
├── main.py
└── qml
├── main.qml
└── pages
├── index.qml
└── login.qml
main.py
导入操作系统
从pathlib导入路径
导入系统
来自PySide2.QtCore导入属性、QObject、信号、插槽
从PySide2.QtGui导入qgui应用程序
从PySide2.QtQml导入QQmlApplicationEngine
类控制器(QObject):
logged\u changed=信号(name=“loggedChanged”)
_是否记录=错误
@属性(bool,notify=logged\u changed)
def记录(自):
返回自我。已记录
def更改状态(自身,是否记录):
如果self.\u已记录==已记录:
返回
self.\u已记录=已记录
self.logged_changed.emit()
@插槽(str,str)
def登录(自我、用户名、密码):
self.change_状态(用户名=“用户名”和密码=“密码”)
@槽()
def注销(自我):
self.change_状态(False)
def main():
app=qgui应用程序(sys.argv)
控制器=控制器()
引擎=QQmlApplicationEngine()
engine.rootContext().setContextProperty(“控制器”,控制器)
engine.load(os.fspath(路径(_文件__).resolve().parent/“qml”/“main.qml”))
如果不是engine.rootObjects():
系统出口(-1)
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
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")
}
}
}
}
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)
}
}
}
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()
}
}
login.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")
}
}
}
}
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)
}
}
}
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()
}
}
索引.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")
}
}
}
}
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)
}
}
}
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()
}
}
非常感谢你的解释,事实上我做得不对。您的代码更加清晰,但它稍微改变了实现的原理,因为现在日志页面加载到stackview中,而不是新窗口中。有没有办法在新窗口中执行此操作,或者确实会使所有代码复杂化?