QFileDialog 不发出信号
Posted
技术标签:
【中文标题】QFileDialog 不发出信号【英文标题】:QFileDialog does not emit signals 【发布时间】:2016-05-30 15:37:20 【问题描述】:我在 Qt 中有一个用于保存文件的 QFileDialog。
它不是发送信号。我通过它连接它 QFileDialog 诊断(此); ...
connect(
dialog, SIGNAL(filterSelected(const QString&)),
this, SLOT(saveAsDiagFilterSelected(const QString&)),
Qt::QueuedConnection);
然后用exec()
调用它。 saveAsDiagFilterSelected
永远不会被调用。
可能出了什么问题?
这就是我创建对话框的方式:
dialog = new QFileDialog(this);
dialog->setFileMode(QFileDialog::AnyFile);
dialog->setNameFilters(filterList);
dialog->setAcceptMode(QFileDialog::AcceptSave);
dialog->setWindowTitle(windowTitle);
我尝试实现新的信号 API(如 cmets 中所建议的那样):
connect(
dialog, &QFileDialog::filterSelected,
this, &MainWindow::saveAsDiagFilterSelected);
但仍然没有结果。
更新
发现使用操作系统本机对话框(我在 Linux 下,不知道这是否发生在其他 SO 中),正在产生问题。如果我这样做了
dialog->setOption(QFileDialog::DontUseNativeDialog, true);
发出信号。我该如何解决这个问题?
【问题讨论】:
从您的信号/插槽签名中删除const
和引用。
为我工作。您在标准错误中看到“没有这样的插槽......”吗?顺便说一句:如果你使用QFileDialog diag(this)
,那么你的连接应该以connect(&diag, ...
开始
考虑使用new signal slot syntax。这会产生编译时错误,而不是旧语法(使用 SIGNAL
和 SLOT
宏)产生的运行时错误。
@KarstenKoop 我没有运行时错误
@IInspectable 我没有收到运行时错误!更改为新的信号 API 并没有解决问题:(
【参考方案1】:
您平台上的本机对话框不会通知用户有关过滤器更改的信息,因此 Qt 不会发出任何信号 - 特定的本机对话框不可能。或者可能在 Qt 中没有实现必要的功能。此行为是特定于平台的。它至少可以在 Windows 上运行。
【讨论】:
@manatttta 为什么你认为你的平台支持这个?您的平台是什么? 我使用的是 Linux。这将是一个跨平台工具(UNIX + Windows)。我没有假设它,我放弃了使用该信号,所以我正在寻找一种解决方法,以便在用户更改过滤器时得到通知,以便可以在“另存为”对话框中强制使用默认后缀 很抱歉没有明确平台的含义。 Qt 在您的系统上使用什么exact UI 样式?显而易见的解决方法是在 OS X 以外的 Unices 上使用信号并使用非原生样式。 但我将使用本机对话框。我不确定 UI 风格,我在 Ubuntu Linux 下(应该支持的平台之一) Ubuntu 并没有真正的“本机”对话框。您可以运行 gnome 或 kde,并且 Qt 可能在某种程度上与 gnome 的对话框集成。集成很可能没有实现滤波器切换信号。您必须查看 Qt 源代码以了解支持的内容,以及是否可以修补您的 Qt 副本来修复它。【参考方案2】:尝试像这样设置插槽/信号:
connect(
dialog, SIGNAL(filterSelected(QString)),
this, SLOT(saveAsDiagFilterSelected(QString)),
Qt::QueuedConnection);
【讨论】:
这没有解决。函数是const QString&
,有区别吗?以上是关于QFileDialog 不发出信号的主要内容,如果未能解决你的问题,请参考以下文章