在Qt中切换应用程序窗口的最佳做法是什么?

时间:2010-01-18 13:59:20

标签: qt symbian

我有一个应用程序,其中包含从QMainWindow派生的以下UI表单

  • 登录窗口
  • TasksWindow
  • DetailsWindow

我应该登录LoginWindow中的应用程序,我将移动到TasksWindow。在TasksWindow中,我将从组合框中选择一个项目,然后我应该移动到DetailsWindow并填充与该项目相关的数据。在DetailsWindow上,我将有一个菜单操作将我返回到TasksWindow。

目前,我的想法(以及我尝试过的)就是这样。在main.cpp中:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    LoginWindow loginWindow;
    loginWindow.showMaximized();

    return app.exec();
}

在LoginWindow按钮中:

void LoginWindow::on_loginButton_clicked()
{
        this->hide(); // hide the login window
        TasksWindow tasksWindow;
        tasksWindow.showMaximized();
}

有更好的方法吗?它变得难以管理,因为现在我必须包含对我应该去的每个窗口类的引用,可能会创建循环引用!

请注意,我这样做并将应用程序编译为Qt Symbian应用程序。

在应用程序窗口之间切换的最佳方法是什么?我之前想过使用QStackedWidget,并且实际上尝试了它,但问题是我必须编写所有代码来处理同一文件中的不同事件,并且操作菜单在窗口之间是不同的。

帮助! :)

2 个答案:

答案 0 :(得分:4)

我的建议是使用State Machine来管理您的所有状态。它也很容易扩展。

  1. 阅读Qt帮助中的State Machine Framework文档。
  2. 在掌握了Qt状态机框架的基本知识后,您可以理解以下方法。
  3. a。)定义必要的状态,例如访客,已登录,已注销。每个状态可能有3个对话框(我在这里定义了一个额外的注销对话框),将状态输入信号连接到对话框显示槽,并将状态退出信号连接到对话框隐藏槽。通过这种方式,您无需担心何时显示/隐藏对话框,只需关注状态转换。

    B)。定义对话框的信号,例如,为loginWindow发信号“loggedIn”,为TasksWindow发信号“loggedOut”,添加由状态Guest登录的信号“loggedIn”触发的转换。

    C)。所以状态机的初始状态是“guest”,当这个状态进入时,你的loginWindow会出现。在验证登录信息后,发出“loggedIn”信号,并且机器的状态将从“guest”变为“Logged In”,因此当“Guest”状态退出时,loginWindow将被隐藏,而您的TasksWindow将会当“登录”状态进入时显示。

    d)。您可以通过单击TasksWindow中的“注销”来结束会话,您还需要做的是定义状态更改的三分之一。

    E)。这里的一个技巧:您可以定义最终状态,并将状态机的“已完成”或“已停止”信号连接到您的应用程序“退出”插槽。完成所有操作后,应用程序将由状态机自动关闭。

    易于维护和扩展,使用状态机可以非常清楚逻辑。

答案 1 :(得分:0)

它可能除了点/问题之外,但我会使用模态对话框来登录和详细信息窗口。