我正在 QT 中的一个程序中工作,其中有一个登录对话框,如果该人成功登录,则该程序显示一个 MainWindow 对象。该对象中有一个菜单栏。菜单栏的选项之一是 LOGOUT,那么我该怎么做才能使 MainWindow 对象关闭或隐藏并再次显示 LOGIN Dialog?
这是我尝试过的:
在 main.cpp

Dialog login;

if (login.exec() == QDialog::Rejected)
{
    return -1;
}

MainWindow mainWindow;
mainWindow.show();
在菜单栏的注销功能中:
void MainWindow::on_actionLogOut_triggered()
{
    close();
    //What else can I do here to make the LOGIN Dialog appear again?
}
我还尝试在 on_actionLogOut_triggered() 方法中创建一个新的 LOGIN 对象,但它超出了范围并且新的 Dialog 对象立即消失。

最佳答案

在这里你需要一个有限状态机......
根据您的应用程序处于哪种状态以及调用哪些函数将决定整个系统的行为。您将希望拥有自己的功能来显示登录窗口、显示主窗口、登录、注销等......然后您需要使用适当的逻辑构建您的结构。
伪示例:

enum class AppState {
    LOGGED_IN,
    LOGGED_OUT,
};

class Application  {
   AppState state_;
public:
    Application() : state_{AppState::LOGGED_OUT} {
        run();
    }

    ~Application() {
        exitApp();
    }

    void exitApp() {
        // clean up resources
        closeMainWindow(true);
    }

    void run() {
        do {
            presentLoginScreen();
        } while(state_ != AppState::LOGGED_IN);

        if (state_ == AppState::LOGGED_IN) {
            while (state_ != AppState::LOGGED_OUT)
                // do stuff
        }
    }

    void logIn(/*user input*/) {
        // test input
    }

    void logOut() {
        if(state_ == AppState::LOGGED_IN) {
            closeMainWindow();
            state_ = AppState::LOGGED_OUT;
            presentLogginScreen();
        }
    }

    void presentLogginScreen() {
        // display the login screen

        // get user input
        logIn(/*user input*/);

        // if user input matches credentials sign them in and show the main window
        if( credentials == valid_credentials ) {
            showMainWindow();
            state_ = AppState::LOGGED_IN;
        }
    }

    void closeMainWindow(bool exitApp) {
        if(exitApp) // cleanup memory and shutdown
        else // otherwise just close window and present login screen
    }

};

关于c++ - 如何将函数 "go back"编程为 QT 中 MainWindow 的菜单栏选项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63163562/

10-12 17:28