我有一个继承自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();
//...
}
从上面的代码中不清楚您如何知道路径已更改。我不确定directory()
对此负责。
考虑使用void QFileDialog::directoryEntered(const QString & directory)
信号。
解决方法:
我碰巧每次打开FileDialog
时都会设置对话框标题(setWindowTitle()
)。如果我连接到QFileDialog::windowTitleChanged
信号并在插槽内呼叫setDirectory
,它是有效的。
不过,这是一个不直观的解决方法,所以我愿意接受更好的答案。