2016-09-13 44 views
1

在我的Qt程序中,有一個菜單欄,其中一個菜單選項是設置。當用戶點擊設置窗口時,它應該打開一個設置窗口。使用openSettingsWindow()功能打開設置窗口。這是我在主窗口中進行設置菜單:用插槽打開一個新的Qt窗口

QMenu settingsMenu("&Settings"); 
QAction *settings = toolsMenu.addAction("&Settings"); 
Window::connect(settings,&QAction::triggered,&mainWindow,[&mainWindow](){ 
    openSettingsWindow(); 
}); 
menuBar.addMenu(&toolsMenu); 

mainWindow是主窗口和Window是用於創建從QWidget繼承窗口類。它的構造函數有兩個參數:窗口的標題和窗口的圖標。這是openSettingsWindow()功能:

void openSettingsWindow(){ 
    Window settingsWindow("Settings","icon.png"); 
    settingsWindow.show(); 
} 

的問題是,當我點擊ONT他在設置菜單設置選項,在設置窗口中打開,因爲它應該,但之後不到一秒鐘,直接關閉。我應該怎麼做才能保持設置窗口打開?

+3

***,但在不到一秒鐘後直接關閉***當'openSettingsWindow()'結束時,窗口超出範圍。 – drescherjm

回答

1

您需要返回對該Window的引用並保留該引用,直到不再使用它爲止。

Window *openSettingsWindow() { 
    Window *settingsWindow = new Window("Settings, "icon.png"); 
    settingsWindow.show(); 
    return settingsWindow; 
} 

QMenu settingsMenu("&Settings"); 
QAction *settings = toolsMenu.addAction("&Settings"); 
Window *settingsWindow = null; 
Window::connect(settings,&QAction::triggered,&mainWindow,[&mainWindow, &settingsWindow](){ 
    settingsWindow = openSettingsWindow(); 
}); 
menuBar.addMenu(&toolsMenu); 

您可能希望找到存儲settingsWindow指針在主函數中,如果你將有許多可能打開的窗口,但是這會工作的更好的方法。

記得撥打delete()上的指針當你與設置窗口(可能的窗口關閉事件)

+0

我該怎麼做?請包含一些代碼。 –

+0

編輯完成後,你正在泄漏'Window'對象,'settingsWindow'永遠不會被破壞。 – Mike

+0

OP可以自由處理返回的Window指針,但是他們希望將其存儲在某個可以在時間釋放它的地方。我沒有足夠的代碼來告訴我們什麼時候該這樣做。 – sokkyoku

2

做局部變量settingsWindow當你的功能openSettingsWindow超出範圍被破壞,則需要只要你想顯示你的settingsWindow就保持對象有效。

一個解決辦法是在堆上分配的Window對象,並使用Qt::WA_DeleteOnClose使Qt的刪除Window對象,你當它是封閉的,這裏是如何你openSettingsWindow會是什麼樣子:

void openSettingsWindow(){ 
    Window* settingsWindow = new Window("Settings","icon.png"); 
    settingsWindow->setAttribute(Qt::WA_DeleteOnClose); 
    settingsWindow->show(); 
} 
+0

這應該是被接受的答案 – sokkyoku