【问题标题】:Qt - Close subMenu with signal/slotQt - 使用信号/插槽关闭子菜单
【发布时间】: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,但没有成功。

任何帮助都会很棒

【问题讨论】:

    标签: qt signals-slots qmainwindow


    【解决方案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(),它会在窗口关闭之前被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多