FileDialog显示了与Python3和QML的不同界面

时间:2016-03-27 13:49:25

标签: python qml pyqt5 qfiledialog

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

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

这是正常的文件对话框:

enter image description here

这是一个奇怪的文件对话框:

enter image description here

代码如下:

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()

1 个答案:

答案 0 :(得分:1)

"奇怪" file-dialog是一个完全用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([])