zonzely
zonzely

Reputation: 395

FileDialog shows different interface with Python3 vs QML

I have a python file and a qml file.

There is a button in the qml file to load a FileDialog. When I directly use qmlscene test.qml, the FileDialog is ok. But when I use python3 main.py, the FileDialog is strange, and I can't select a file by it. Please tell me how to fix it.

This is the normal file-dialog:

enter image description here

And this is the strange file-dialog:

enter image description here

The code is the following:

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

Upvotes: 2

Views: 532

Answers (1)

ekhumoro
ekhumoro

Reputation: 120718

The "strange" file-dialog is a default implementation that has been written entirely in QML. Qt will use this as a fallback when it cannot create either the platform's native dialog or the built-in QFileDialog.

The reason why your example uses the qml fallback, is because you are using QGuiApplication, which is not widget-based. If you switch to QApplication, your example will work as expected:

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

Upvotes: 3

Related Questions