Qt - 使用信号/插槽关闭子菜单

Posted

技术标签:

【中文标题】Qt - 使用信号/插槽关闭子菜单【英文标题】:Qt - Close subMenu with signal/slot 【发布时间】:2012-12-22 06:38:51 【问题描述】:

我有一个 Qt 主窗口,我在其中调用另一个窗口,实际上是一种子菜单,其中包含第一个窗口的参数;这是这个主窗口的一部分:

void Ui_MainWindow::createSignals()
 
  connect(actionDisk_galaxy, SIGNAL(triggered()), this,  SLOT(ICMenu()));


void Ui_MainWindow::ICMenu()

qmenu = new QMainWindow;
DiskMenu = new Ui_DiskGalMenu;
DiskMenu->setupUi(qmenu,this);
setInitialDiskMenuPosition(qmenu, this);
qmenu->show();

如你所见,我调用了另一个 QMainwindow ("qmenu");这是这个新窗口的代码(类型为“Ui_DiskGalMenu”):

void Ui_DiskGalMenu::createMenuSignals()

  connect(pushButton_4, SIGNAL(clicked()), this, SLOT(closeMenu()));       


void Ui_DiskGalMenu::closeMenu()
  
close(true);
 

在这个子菜单中设置好参数后,我想用一个按钮关闭它(这里是“pushButton_4”)。

我的问题是当我点击“pushButton_4”时,这个窗口没有关闭。

我也尝试重新实现closeEvent,但没有成功。

任何帮助都会很棒

【问题讨论】:

【参考方案1】:

这个函数调用看起来像个错误:

close(true);

QWidget::close() 不带任何参数。所以你在这里做的是调用 C 库的 close(int) 函数(用于关闭文件描述符)。bool 被隐式转换为int,所以你最终得到了这个调用:

::close(1);

这是(可能)关闭stderr

如果您将上面的内容更改为:

this->close(true);

你应该得到一个编译错误,因为不存在这样的函数。所以正确的调用应该是:

this->close();

但是,QWidget::close() 已经是一个槽,所以你根本不需要 Ui_DiskGalMenu::closeMenu() 函数。您只需要连接到 close() 插槽即可:

connect(actionDisk_galaxy, SIGNAL(triggered()), this, SLOT(close()));

如果你需要在窗口关闭时做更多的事情,你可以重写closeEvent(),它会在窗口关闭之前被调用。

【讨论】:

以上是关于Qt - 使用信号/插槽关闭子菜单的主要内容,如果未能解决你的问题,请参考以下文章

小部件关闭后 Qt 发出信号

Qt:将信号/绑定参数适应插槽?

Qt 中的多级子菜单

多级子菜单不会在点击时关闭子菜单

子菜单级别的 GtkMenu 无法在 ubuntu 20.04 中引发“活动”信号

带有多个子菜单下拉菜单的 jQuery 导航菜单关闭父菜单项