FileDialog 显示 Python3 与 QML 的不同界面

FileDialog shows different interface with Python3 vs QML

我有一个python文件和一个qml文件。

qml 文件中有一个按钮可以加载一个FileDialog。当我直接使用 qmlscene test.qml 时,FileDialog 就可以了。但是当我使用 python3 main.py 时,FileDialog 很奇怪,我无法通过它 select 一个文件。请告诉我如何修复它。

这是正常的文件对话框:

这是奇怪的文件对话框:

代码如下:

test.qml

import QtQuick 2.4
import QtQuick.Dialogs 1.2
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.3
import QtQuick.Layouts 1.1

Rectangle {
        width: 400 
        height:30 



        Button {
                id: save
                text: "save"
                onClicked: {
                        fileDialogLoader.item.open()
                    }
            }
        Loader {

                id: fileDialogLoader
                sourceComponent: fileDialog_com
            }

        Component{
                id: fileDialog_com


                FileDialog {
                        id: fileDialog
                        title: "select a file"
                        nameFilters: ["pdf files(*.pdf)"]
                        selectExisting: false

                        onAccepted: {
                                console.log(" you choose: "+ fileDialog.fileUrls)
                            }
                    }
            }
    }

main.py

#!/usr/bin/env python
# encoding: utf-8

from PyQt5.QtCore import  QUrl, QObject, pyqtSlot
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQuick import QQuickView

class MyMain(QObject):
    pass


if __name__ == '__main__':
    path = 'test.qml'
    app = QGuiApplication([])
    view = QQuickView()
    con = MyMain()
    context = view.rootContext()
    context.setContextProperty("con",con)
    view.engine().quit.connect(app.quit)
    view.setSource(QUrl(path))
    view.show()
    app.exec()

"strange" 文件对话框是完全用 QML 编写的默认实现。当 Qt 无法创建平台的本机对话框或内置的 QFileDialog.

时,它将 use this as a fallback

您的示例使用 qml 回退的原因是因为您使用的是 QGuiApplication,它不是基于小部件的。如果您切换到 QApplication,您的示例将按预期工作:

# from PyQt5.QtGui import QGuiApplication
from PyQt5.QtWidgets import QApplication
...
# app = QGuiApplication([])
app = QApplication([])