在我的Qt程序中,有一个菜单栏,其中一个菜单选项是“设置”。当用户单击“设置”窗口时,应该打开“设置”窗口。使用openSettingsWindow()
功能打开设置窗口。这就是我在主窗口中创建“设置”菜单的方式:
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();
}
问题是,当我点击“设置”菜单中的“设置”选项时,“设置”窗口会按原样打开,但会在不到一秒钟后立即关闭。我应该怎么做才能打开“设置”窗口?
答案 0 :(得分: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();
}
答案 1 :(得分: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()