【问题标题】:QFileDialog::DontUseNativeDialog is not workingQFileDialog::DontUseNativeDialog 不工作
【发布时间】:2011-06-19 21:33:37
【问题描述】:

我对一个简单的程序有疑问。 我以这种方式打开 QFileDialog:

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

但是它显示了一个 Qt 对话框而不是本机 Windows 对话框。我使用的是 Windows 7 x64,我真的更喜欢原生对话框而不是 Qt 对话框,因为它有点花哨。但是我读过,我发现这可以通过使用来改变:

fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);

事实上,我得到的不是原生 Windows 对话框,而是 Qt 对话框,所以该选项不起作用...有人知道如何在不使用静态成员的情况下解决这个问题吗?

我真的不想使用静态成员,因为它们有某种内存泄漏问题或其他问题,因为如果您使用静态成员反复打开新对话框,程序使用的内存会增加和增加,但是,使用以前用指针存储的对话框没有这个问题。

所以,如果有人对这两个问题(本机对话和内存泄漏问题)都有答案,请告诉我。

谢谢。

【问题讨论】:

    标签: qt qfiledialog


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我不知道本机对话框不支持...嗯...但是,您知道避免这种“内存泄漏”的方法吗? ...我知道这在技术上不是内存泄漏,但是我想知道是否有办法避免静态成员的这种行为...
    • 我从未听说过内存泄漏问题。您对此有更详细的信息吗?如果是,请将其报告为 Qt 错误。
    • 我从未注意到使用这些函数有任何内存泄漏。
    • 是的,正如我所说,从技术上讲,这不是内存泄漏,但如果您调用静态成员,它会创建父级(主窗口)的新子级,但它永远不会删除,因为父级(主窗口)有孩子的控制权,所以,当父母不是之前,孩子被删除......所以,这导致如果你调用静态成员,每次调用它时使用的内存都会增加......
    【解决方案2】:

    你确定这样的孩子是造出来的吗?因为如果是这样,我会假设你可以做类似的事情

    QString path = QFileDialog::getExistingDirectory(this, ...);
    
    QFileDialog *filedialog = this->findChild<QFileDialog*>();
    if (filedialog) {
        filedialog->deleteLater();
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 2021-09-27
      • 1970-01-01
      • 2017-11-24
      • 2023-04-06
      相关资源
      最近更新 更多