Каковы лучшие практики при переключении между окнами приложений в Qt? - PullRequest
3 голосов
/ 18 января 2010

У меня есть приложение со следующими формами пользовательского интерфейса, полученными из QMainWindow

  • * 1004 пользователя появляется *
  • TasksWindow
  • DetailsWindow

Я должен войти в приложение в окне LoginWindow, где я перейду к окну Tasks. В окне 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 ]

4 голосов
/ 19 января 2010

Я предлагаю использовать State Machine для управления всем вашим статусом. Его также довольно легко расширить.

  1. Прочитайте документы State Machine Framework в Справке Qt.
  2. После того, как вы приобретете некоторые базовые знания о структуре конечного автомата Qt, вы можете понять подход, приведенный ниже.

а.) Определите необходимое состояние, например, Гость, залогинился, вышел из системы. У вас может быть 3 диалоговых окна (здесь я определил дополнительный выходящий из системы диалог) для каждого состояния, подключите сигнал ввода состояния к слоту показа диалога и подключите сигнал выхода из состояния к слоту скрытия диалога. Таким образом, вам не нужно беспокоиться о том, когда показывать / скрывать диалог, просто сосредоточьтесь на переходе состояний.

б). Определите сигналы для диалогов, например, сигнал «loggedIn» для loginWindow, сигнал «loggedOut» для TasksWindow, добавьте переход, инициируемый сигналом «loggedIn», из состояния «Гость» во вход в систему.

с). Таким образом, начальное состояние конечного автомата - «гость», и при входе в это состояние появляется ваше окно входа в систему. После того, как информация для входа была проверена, был выдан сигнал «loggedIn», и состояние компьютера изменится с «гостя» на «Вход в систему», поэтому loginWindow будет скрыто при выходе из состояния «Гость», и ваше окно TasksWindow будет отображается при входе в состояние "Вход в систему".

г). Вы можете завершить сеанс, нажав кнопку «Выйти» в окне TasksWindow, также вам нужно определить тривиумы для изменения состояний.

е). Хитрость здесь: вы можете определить конечное состояние и подключить сигнал «закончен» или «остановлен» конечного автомата к слоту «выход» вашего приложения. Затем, после того как вы все сделаете, приложение будет автоматически закрыто на автомате.

Легко поддерживать и расширять, и логика очень ясна с помощью конечного автомата.

0 голосов
/ 18 января 2010

Это может быть помимо точки / вопроса, но я бы использовал модальные диалоги для окон входа в систему и сведений.

...