2

在 Qt 中,

QFileDialog *dlg = new QFileDialog(); 
QDir dir = dlg->getExistingDirectory(this, tr("Choose folder"), qgetenv("HOME"));

打开一个文件夹选择对话框。一旦我选择了一个文件夹(按选择按钮),该文件夹就不会自动关闭。所以我尝试了:

if(dlg->close() == true) delete(dlg);

当我调试 dlg->close() 返回 true 并且代码 delete(dlg) 被命中。文件夹选择器对话框仍然没有关闭。

我正在使用 Ubuntu 11.10 64 位操作系统。使用存储库中的 Qt 库。

我的最终目标只是显示一个文件夹选择器对话框,一旦选择了文件夹,对话框就会关闭。之后处理应该继续。这该怎么做?

提前致谢。

4

3 回答 3

7

即使QFileDialog::getExistingDirectory是静态的并且不需要QFileDialog对象来工作,它也应该在最终选择目录时关闭对话窗口。默认情况下,该函数会尝试打开本机文件对话窗口,这似乎会在某些平台上引起一些问题。

您应该尝试通过添加选项来强制非本地对话框DontUseNativeDialog

QString dir = QFileDialog::getExistingDirectory(
    this, 
    tr("Choose folder"),
    QDesktopServices::storageLocation(QDesktopServices::HomeLocation),
    QFileDialog::ShowDirsOnly | QFileDialog::DontUseNativeDialog);

并删除另外两行(使用new QFileDialogif(dlg->close()) ...)。

于 2012-07-02T00:04:15.610 回答
1

getExistingDirectory(...)是一个静态函数。

于 2012-07-01T20:20:05.307 回答
0

要添加到 cmannett85 的答案:

您不应该创建QDialog. 如果你这样做了,你可以隐藏它。修改您的代码以读取

const QString home = QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
const QDir dir = QFileDialog:getExistingDirectory(this, tr("Choose folder"), home);

这段代码应该是相对可移植的。qgetenv("HOME")是 Unix 特定的。您不应该在基于 Qt 的项目中引入无偿的特定于平台的代码——它首先违背了使用 Qt 的目的。

于 2016-08-10T20:58:20.367 回答