首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Qt 多視窗切換重複顯示問題:正確管理視窗生命週期

     編輯:程式設計綜合問答

問題現象

點擊按鈕切換視窗時,每次都產生兩個相同視窗實例,而非切換既有視窗。程式碼在 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();
}

方案二:QStackedWidget(官方推薦,適合複雜流程)

// 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); });

方案三:父子關係 + deleteOnClose

void Widget_Login::on_pushButton_clicked() {
    Mainmenu *menu = new Mainmenu(this); // 設定父物件
    menu->setAttribute(Qt::WA_DeleteOnClose); // 關閉時自動刪除
    this->close();
    menu->show();
}

建議

採用 QStackedWidget 架構最清晰,視窗切換為索引切換,生命週期由堆疊統一管理,避免記憶體洩漏與重複實例。參考教學:QT 實現多視窗切換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved