QFileDialog::DontUseNativeDialog无法工作

10

我有一个简单程序的问题。我是这样打开QFileDialog的:

QFileDialog fileDialog(this);
fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
if (!fileDialog.exec())
return;

然而它显示了一个Qt对话框,而不是本机的Windows对话框。我使用的是Windows 7 x64,我真的更喜欢本机对话框,因为它有点更加花哨。但是我已经阅读并发现可以通过使用以下方式进行更改:

fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
事实是我没有得到本机Windows 对话框,而是Qt对话框,所以那个选项不起作用...有人知道如何解决这个问题而不使用静态成员吗?
我不想使用静态成员,因为它们存在一种内存泄漏问题或者说如果你重复使用带有静态成员的新对话框,程序使用的内存会增加,然而,使用先前使用指针存储的对话框就没有这个问题。
所以,如果有人对这两个问题(本地对话框和内存泄漏问题)有答案,请告诉我。
谢谢。
2个回答

8

原生对话框不支持QFileDialog类公开的全部功能。这就是为什么它们只能通过称为getOpenFileName()getSaveFileName()等的静态快捷函数来使用。如果您正在使用这些函数,但仍不想看到原生对话框,则可以使用DontUseNativeDialog标志。


谢谢,我不知道原生对话框不支持这个...好吧...但是,你知道避免这种“内存泄漏”的方法吗?...我知道这在技术上并不是内存泄漏,但我想知道是否有一种方法可以避免这种静态成员的行为。 - daleotar
1
我从未听说过那个内存泄漏问题。你有更详细的信息吗?如果有,请将其报告为Qt错误。 - Frank Osterfeld
1
我从未注意到使用这些函数会出现内存泄漏。 - shoosh
是的,正如我所说,这不是技术上的内存泄漏,但如果您调用静态成员,则会创建父窗口(mainwindow)的新子级,但它永远不会被删除,因为父窗口(mainwindow)控制着子级,因此只有在父级被删除之后才会删除子级... 因此,如果您调用静态成员,则每次调用时使用的内存都会增加... - daleotar

0

你确定这样的子元素被创建了吗?因为如果是这样,我会认为你可以做出类似这样的操作

QString path = QFileDialog::getExistingDirectory(this, ...);

QFileDialog *filedialog = this->findChild<QFileDialog*>();
if (filedialog) {
    filedialog->deleteLater();
}

但我尝试使用this作为父对象创建对话框,并在this对象中调用findChild,以及使用0作为父对象创建对话框并在主窗口中调用findChild,但两者都无济于事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接