关闭对话框后如何触发方法

Posted

技术标签:

【中文标题】关闭对话框后如何触发方法【英文标题】:How to trigger a method after closing a dialog box 【发布时间】:2017-11-20 01:29:17 【问题描述】:

我做了一个简单的工具应用程序。有一个设置按钮可打开设置对话框窗口。有一个保存按钮可以保存设置并关闭窗口。我想要的是如何让主窗口在对话框关闭时执行特定的功能。

我让设置对话框中的 closeEvent 触发,但不确定如何从 closeevent 调用主窗口上的方法。

编辑:我设法覆盖 closeEvent,但我不确定如何从 SettingDialog 触发 Mainwindow 中的方法。我试过这个:

void SettingsDialog::closeEvent(QCloseEvent *event) 

    qDebug() << "CloseEvent Called";
    QTimer::singleShot(250, this, &MainWindow::SettingsSaved);


报错:

错误:没有匹配的函数调用 'QTimer::singleShot(int, SettingsDialog*, void (MainWindow::*)())' QTimer::singleShot(250, this, &MainWindow::SettingsSaved); ^

【问题讨论】:

您可以使用在过载的closeEvent() 中触发的单次计时器 覆盖对话框小部件的closeEvent(),让它在关闭时发出一个信号,然后由主窗口处理。 你能给出示例代码吗? 如果您的函数存在于MainWindow 类上,则提供指向主窗口的指针而不是this,如果您想在关闭时运行函数并保持窗口可见直到结束该函数,使用event-&gt;ignore();防止在某些东西仍在运行或等待运行时关闭窗口,然后在准备关闭窗口时调用QWidgetclose方法,不要调用event-&gt;ignore();这次。 @GeneCode - thisSettingsDialog 类型而不是 MainWindow 类型。 【参考方案1】:

解决更新的问题:

在创建对话框时将主窗口指针作为父级传递:

new SettingsDialog(this);

假设您是在主窗口中创建它。现在您有一个指向对话框内主窗口的指针,尽管它会显示为 QWidget *

将父级转换为适当的类型:

MainWindow * mainptr = qobject_cast<MainWindow *>(parent());

你甚至不需要为你想要达到的目标使用计时器,你可以简单地:

if (mainptr) mainptr-&gt;SettingsSaved();

所以,最后是这样的:

void SettingsDialog::closeEvent(QCloseEvent *event) 
   if (settingsAreAllOK) 
     MainWindow * mainptr = qobject_cast<MainWindow *>(parent());
     if (mainptr) mainptr->SettingsSaved();
     event->accept();
    else event->ignore();

【讨论】:

以上是关于关闭对话框后如何触发方法的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI对话框 - 关闭后无法打开

jQuery UI 对话框 - 关闭后不打开

在layer关闭后,要执行某个函数,该怎么写

ASP.NET如何点击按钮后关闭当前窗口?

C# WinForm 怎么设置弹出对话框然后2秒后自动关闭

在对话框外发生单击时如何触发事件