點擊按鈕切換視窗時,每次都產生兩個相同視窗實例,而非切換既有視窗。程式碼在 on_pushButton_clicked() 中以 new Mainmenu() 建立新視窗,並 this->close() 關閉目前視窗。
new 新視窗,舊視窗未被刪除(僅 close() 隱藏),導致記憶體洩漏與多重顯示。QStackedWidget 統一管理。// Mainmenu.h
static Mainmenu* instance();
private:
Mainmenu(QWidget *parent = nullptr);
static Mainmenu* _instance;
// Mainmenu.cpp
Mainmenu* Mainmenu::_instance = nullptr;
Mainmenu* Mainmenu::instance() {
if (!_instance) _instance = new Mainmenu();
return _instance;
}
// 登入視窗切換
void Widget_Login::on_pushButton_clicked() {
this->hide(); // 隱藏而非關閉
Mainmenu::instance()->show();
}
// main.cpp
QStackedWidget stack;
Widget_Login login;
Mainmenu mainMenu;
stack.addWidget(&login);
stack.addWidget(&mainMenu);
stack.show();
// 切換邏輯
connect(&login, &Widget_Login::loginSuccess, [&](){ stack.setCurrentWidget(&mainMenu); });
connect(&mainMenu, &Mainmenu::logout, [&](){ stack.setCurrentWidget(&login); });
void Widget_Login::on_pushButton_clicked() {
Mainmenu *menu = new Mainmenu(this); // 設定父物件
menu->setAttribute(Qt::WA_DeleteOnClose); // 關閉時自動刪除
this->close();
menu->show();
}
採用 QStackedWidget 架構最清晰,視窗切換為索引切換,生命週期由堆疊統一管理,避免記憶體洩漏與重複實例。參考教學:QT 實現多視窗切換。