用插槽打开一个新的Qt窗口

时间:2016-09-13 13:17:25

标签: c++ qt

在我的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();
}

问题是,当我点击“设置”菜单中的“设置”选项时,“设置”窗口会按原样打开,但会在不到一秒钟后立即关闭。我应该怎么做才能打开“设置”窗口?

2 个答案:

答案 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()