【问题标题】:Qt QFileDialog::setDirectory funny behavior in Ubuntu 12.04Ubuntu 12.04 中的 Qt QFileDialog::setDirectory 有趣的行为
【发布时间】:2015-09-02 00:22:57
【问题描述】:

我有一个继承自 QFileDialog 的类。在构造函数中,我调用setDirectory 并传入最后访问的目录(该类会跟踪该目录;参见下面的代码)。在 Windows 上,这可以正常工作。如果我多次显示该对话框,它在内部足够聪明,可以在最后一个位置恢复(例如,用户之前保存文件的位置)。这是期望的行为。

另一方面,在 Ubuntu 12.04(GCC 4.8 编译器)上,如果我多次调用 showFileDialog,系统不会自动从上次中断的地方恢复。所以我尝试在该函数中添加setDirectory 调用,如下所述,但这并没有改变任何东西。此外,如果我从构造函数中取出setDirectory,以便仅在showFileDialog 中调用它,则文件对话框将打开到运行程序的文件夹。 (即 setDirectory 不起作用。)随后对 showFileDialog 的调用将打开一个从请求的目录开始的文件对话框。

所以看起来这个电话有延迟的效果。这是 Qt 的错误,还是我的?无论哪种方式,我怎样才能让setDirectory 调用有效?

示例代码:

QString FileDialog::defaultDir = QDir::homePath();

FileDialog::FileDialog(QWidget *parentWindow /*, ...*/)
    : QFileDialog(parentWindow)
{
    setDirectory(defaultDir);
    //...
}

QString FileDialog::showFileDialog()
{
    // Adding setDirectory(defaultDir) here doesn't help.

    if(!exec())
    {
        return QString::null;
    }

    defaultDir = directory().path();
    //...
}

【问题讨论】:

  • 本机对话框可能有限制。尝试使用DontUseNativeDialog 选项。
  • 我忘了说:我确实验证了 DontUseNativeDialog 可以正常工作,但我更愿意通过原生对话框保持 Ubuntu 的感觉。

标签: c++ qt user-interface qfiledialog


【解决方案1】:

从上面的代码中不清楚您是如何知道路径已更改的。我不确定 directory() 是否对此负责。

考虑使用void QFileDialog::directoryEntered(const QString & directory) 信号。

【讨论】:

  • 我通过查看文件对话框 UI 知道路径,但现在我也尝试检查该信号。 directoryEntered 信号在对话框打开时报告当前目录,然后每次我移动到对话框中的不同文件夹时。它似乎不是由对 setDirectory 的调用触发的。
【解决方案2】:

找到解决方法:

我碰巧在每次打开FileDialog 时设置对话框标题 (setWindowTitle())。如果我连接到QFileDialog::windowTitleChanged信号并在槽内调用setDirectory,它是有效的。

虽然这是一个不直观的解决方法,所以我愿意接受更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2014-05-01
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多