Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用注销按钮注销应用程序?_Python_Button_Qml_Logout_Pyside2 - Fatal编程技术网

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

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

我有一个带有身份验证页面的应用程序,然后是一个带有注销按钮的主页。当我按下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()


    }
}



您不必要地创建了许多信号,从而使应用程序复杂化,而不是在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中,而不是新窗口中。有没有办法在新窗口中执行此操作,或者确实会使所有代码复杂化?