gpt4 book ai didi

c++ - 如何在 QT 中将函数 "go back"编程为 MainWindow 的菜单栏选项?

转载 作者:行者123 更新时间:2023-12-01 14:51:38 24 4
gpt4 key购买 nike

我在 QT 中的一个程序中工作,其中有一个登录对话框,如果此人成功登录,则该程序会显示一个 MainWindow 对象。该对象中有一个菜单栏。菜单栏的选项之一是注销,那么如何关闭或隐藏 MainWindow 对象并再次显示登录对话框?

这是我尝试过的:

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com