So i will reply to myself:
After taking inspiration from "this":http://stackoverflow.com/questions/9651976/transitioning-between-menu-screens-with-qstatemachine SO post and "this":http://pastebin.com/YhbHHJNe code snippet linked in the last comment of the accepted answer, I came up with following solution:
@class CMenuScreenWidget : public QStackedWidget
{
Q_OBJECT
public:
explicit CMenuScreenWidget(QWidget *parent = 0)
: QStackedWidget(parent)
{ }
protected:
/**
* This method will set up a mapping between signals and widgets.
* This means that when a signal of a sender is triggered,
* the menuscreen will be switched to make the widget a currently
* displayed widget.
*
* @param sender connect to signals from this object
* @param signal connect to this particular signal
* @param widget make this widget current upon triggering a signal
*/
void setMapping(QObject *sender, const char *signal, QWidget *widget);
private slots:
void switchWidget(void);
private:
QHash<QObject *, QWidget *> m_mapping; /// to keep mapping between signal senders and widgets
};@
@/**
*/
void CMenuScreenWidget::setMapping(QObject *sender, const char *signal, QWidget *widget)
{
addWidget(widget);
connect(sender, signal, SLOT(switchWidget()));
m_mapping[sender] = widget;
return;
}
/**
*/
void CMenuScreenWidget::switchWidget(void)
{
setCurrentWidget(m_mapping[sender()]);
return;
}
@
And usage could be for example like this:
@class CMainMenuWidget;
class CSinglePlayerMenuWidget;
/**
*/
class CMainWindow : public CMenuScreenWidget
{
Q_OBJECT
public:
explicit CMainWindow(QWidget *parent = 0);
private:
CMainMenuWidget *m_main_menu;
CSinglePlayerMenuWidget *m_single_player;
};
@
@CMainWindow::CMainWindow(QWidget parent)
: CMenuScreenWidget(parent),
m_main_menu(0),
m_single_player(0)
{
/ create widgets */
m_main_menu = new CMainMenuWidget;
m_single_player = new CSinglePlayerMenuWidget;
/* set signals */
connect(m_main_menu, SIGNAL(exitTriggered()), SLOT(close()));
/* set up menu mappings and connections between menu screens */
setMapping(m_main_menu, SIGNAL(singlePlayerTriggered()), m_single_player);
setMapping(m_single_player, SIGNAL(backTriggered()), m_main_menu);
/* set current widget */
setCurrentWidget(m_main_menu);
}@
While not the most efficient, I hope this solution is flexible enough for changes in UI,
which I think is quite an important quality of UI-s in general.