嗯,如果說要作遊戲的話,果然還是要一個方便的場景切換方式。
最一般的就是從主選單跑到遊戲序幕這樣。

過去我曾把機甲指揮官2(Mech Commander 2,不過台譯…)的源始碼大卸八塊。
發現當年他們似乎是預先載入戰鬥外各個場景的記憶體,所以看來其它場景的消耗量應該是不大的。
這對我來說也是差不多的,所以我們就模仿一下吧。

class Window : public QMainWindow
{
    Q_OBJECT
public:
    Window(QWidget parent = 0);
    ~Window();
private slots:
    void when_widgetChange_required(int id);
private:
    QList<QWidget*> m_widgetList;//你當然要把Widget先填進去,我們先假設有。
}

void Window::when_widgetChange_required(int id)
{
    auto w = m_widgetList.value(id);//很確定的話可以用at(id)
    if(w) setCentralWidget(w);
}

嗯,看起來很棒,不過實際上用起來…
當你換Widget的時候,前一個會被delete。
好吧,我們換一下設計,也就是自己來。

class Window : public QMainWindow
{
//......
protected:
    void resizeEvent(QSizeEvent *);
    void connectWidget(QWidget *);
    void disconnectWidget();
//......
private:
    QWidget *up_currentWidget;
    QList<QWidget*> m_widgetList;
}

Window::~Window()
{
    foreach(QWidget *w, m_menuList) {
        delete w;
    }
}

void Window::resizeEvent(QResizeEvent *)
{
    if(up_currentWidget) {
        up_currentWidget->resize(size());
    }
}

void Window::connectWidget(QWidget *w)
{
    up_currentWidget = w;
    up_currentWidget->setParent(this);
    up_currentWidget->move(0, 0);
    up_currentWidget->resize(size());
    up_currentWidget->show();
}

void Window::disconnectWidget()
{
    if(up_currentWidget) {
        up_currentWidget->setParent(nullptr);
        up_currentWidget = nullptr;
    }
}

void Window::when_widgetChange_required(int id)
{
    disconnectWidget();
    connectWidget(m_widgetList.at(id));
}

可能最容易忘的是show(),剛剛試了很多下都沒顯示,害我以為程式掛了…