将 QFileDialog 作为小部件添加到另一个 QDialog 中

Adding QFileDialog as a widget inside another QDialog

我正在尝试创建一个包含两个子小部件的对话框:左侧是一个 QFileDialog 实例,以便用户可以 select 文件,右侧是一个单独的小部件,它将用于显示 selected 文件的预览(如果它是某种类型)。

问题是对话框打开,我可以看到 "preview" 小部件,但 QFileDialog 根本没有显示。

这个简短的例子说明了我的问题:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

app = QApplication([])

main_dialog = QDialog()
main_dialog.setWindowTitle('My Dialog')
layout = QHBoxLayout(main_dialog)

file_dialog = QFileDialog(main_dialog, Qt.Widget)
file_dialog.setOption(QFileDialog.DontUseNativeDialog)
layout.addWidget(file_dialog)

preview = QLabel('Preview', main_dialog)
layout.addWidget(preview)

main_dialog.show()

app.exec_()

我尝试过的一些事情:

  1. 添加file_dialog.show()before/aftermain_dialog.show():这显示了QFileDialog,但在不同的window;我希望文件对话框显示在 main_dialog 中,而不是作为单独的 window;
  2. 不要将 Qt.Widget 传递给 QFileDialog 构造函数,无效;
  3. 不要将 main_dialog 作为父级传递给 QFileDialog,同样无效;
  4. main_dialog 更改为 QWidget 只是为了看看它是否改变了什么,它没有;

我搜索了文档,但没有找到合适的解决方案。

有什么提示吗?此外,欢迎就如何完成允许用户 select 文件并在同一 window 中显示文件预览的任务提出建议。

Context:这是为 Qt3 编写的旧应用程序的端口。 Qt3 的 QFileSystem 对话框内置了这个 "preview" 功能;我正在尝试在 Qt5 中重现相同的功能。

版本

我也尝试过 Python 3.6(来自 conda-forge),但获得了相同的行为。

您需要关闭文件对话框 windowFlags...

中的 Qt.Dialog 标志
file_dialog.setWindowFlags(file_dialog.windowFlags() & ~Qt.Dialog)

否则 QFileDialog 将始终创建为顶级 window。反正对我有用。