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。这会产生编译时错误,而不是旧语法(使用 SIGNALSLOT 宏)产生的运行时错误。 @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 不发出信号的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QFileDialog 使用斜杠而不是反斜杠?

为什么QFileDialog使用斜杠而不是反斜杠?

为啥我不能将 QAction SIGNAL 与 QFileDialog SLOT 连接起来?

为啥 QTcpSocket 不发出信号?

QNetworkAccessManager 不发出完成信号

QTimer 超时信号不发出