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([])
我有一个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
.
您的示例使用 qml 回退的原因是因为您使用的是 QGuiApplication
,它不是基于小部件的。如果您切换到 QApplication
,您的示例将按预期工作:
# from PyQt5.QtGui import QGuiApplication
from PyQt5.QtWidgets import QApplication
...
# app = QGuiApplication([])
app = QApplication([])