关闭对话框后如何触发方法
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->ignore();
防止在某些东西仍在运行或等待运行时关闭窗口,然后在准备关闭窗口时调用QWidget
的close
方法,不要调用event->ignore();
这次。
@GeneCode - this
是 SettingsDialog
类型而不是 MainWindow
类型。
【参考方案1】:
解决更新的问题:
在创建对话框时将主窗口指针作为父级传递:
new SettingsDialog(this);
假设您是在主窗口中创建它。现在您有一个指向对话框内主窗口的指针,尽管它会显示为 QWidget *
。
将父级转换为适当的类型:
MainWindow * mainptr = qobject_cast<MainWindow *>(parent());
你甚至不需要为你想要达到的目标使用计时器,你可以简单地:
if (mainptr) mainptr->SettingsSaved();
所以,最后是这样的:
void SettingsDialog::closeEvent(QCloseEvent *event)
if (settingsAreAllOK)
MainWindow * mainptr = qobject_cast<MainWindow *>(parent());
if (mainptr) mainptr->SettingsSaved();
event->accept();
else event->ignore();
【讨论】:
以上是关于关闭对话框后如何触发方法的主要内容,如果未能解决你的问题,请参考以下文章