2016-09-13 31 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