我正在尝试在QtQuick控件FileDialog中自动选择QML中的文件。当fileUrl属性为只读时,如何使用特定的fileUrl调用FileDialog的accept?
当前的尝试涉及到调用filedialog.clearSelection、filedialog.addSelection,最后调用filedialog.accept。clearSelection和addSelection没有文档记录,但可以在https://github.com/qt/qtquickcontrols/blob/dev/src/dialogs/qquickfiledialog.cpp中找到(假设Qt使用了DefaultFileDialog,因为这可能取决于系统)
然而,clearSelection似乎只能偶尔工作,如果手动使用相同的FileDialog,则没有任何影响,因此addSelection无法设置fileUrl。
下面是一个QML文件(作为QtCreator中的一个基本项目加载)演示了这一点。具有手动文件对话框打开按钮和自动打开按钮:
import QtQuick 2.9
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.4
import QtQuick.Dialogs 1.3
Window {
visible: true;width: 200;height:200
FileDialog {id: filedialog; onAccepted: console.log("File Dialog Accepted: ", fileUrl, fileUrls);}
Row {
Button {text: "manual"; onClicked: filedialog.open()}
Button {
text: "auto_qml"
onClicked: {
console.log("Current selection:", filedialog.fileUrl, filedialog.fileUrls)
filedialog.clearSelection();
console.log("cleared selection:", filedialog.fileUrl, filedialog.fileUrls) // only clears selection if manual not used
let t = filedialog.addSelection("file:/home/user/tempfile.txt");
console.log("add selection success:", t) // a non existent file returns false, so file must exist
filedialog.accept()
}
}
}
}发布于 2021-10-17 07:58:06
作为变种,你可以使用Qt.labs.platform 1.1库。它包含另一个行为的FileDialog -- file属性不是只读的。
你可以这样做:
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.4
import Qt.labs.platform 1.1
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
FileDialog {id: filedialog; onAccepted: console.log("File Dialog Accepted: ", file, files);}
Row {
Button {text: "manual"; onClicked: filedialog.open()}
Button {
text: "auto_qml"
onClicked: {
filedialog.file = "file:/home/user/tempfile.txt";
console.log("Current selection:", filedialog.file, filedialog.files)
filedialog.accepted()
}
}
}
}https://stackoverflow.com/questions/69394338
复制相似问题