代码之家  ›  专栏  ›  技术社区  ›  zonzely

FileDialog显示了Python3与QML的不同接口

  •  2
  • zonzely  · 技术社区  · 9 年前

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

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

    这是正常的文件对话框:

    enter image description here

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

    enter image description here

    代码如下:

    测试.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)
                                }
                        }
                }
        }
    

    主.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 回复  |  直到 9 年前
        1
  •  3
  •   ekhumoro    9 年前

    “奇怪”的文件对话框是完全用QML编写的默认实现。Qt将 use this as a fallback 当它无法创建平台的本机对话框或内置对话框时 QFileDialog .

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

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