我目前正在为Windows开发qt应用程序。用户需要能够选择一个目录来加载所有文件。我有与此相关的问题。看起来很愚蠢,但我不断收到相同的反馈。最终用户对文件对话框感到困惑,因为他们导航到该文件夹,但是该文件夹不显示任何文件。即使他们选择了文件夹,它也使他们看不到目录中的文件。
因此,我决定深入研究它并进行一些研究。从我发现的内容来看,似乎基本上有两个选择。 IFileOpenDialog
和FOS_PICKFOLDERS
,这是我目前通过qt的QFileDialog
使用的。或SHBrowseForFolder
,它确实有效,但功能有限。
我缺少任何选择吗?似乎IFileOpenDialog
在没有允许用户选择的情况下显示文件是理想的。有什么办法可以做到这一点?我发现很多较旧的信息说这是不可能的,但是没有确切的信息是最新的。
答案 0 :(得分:1)
您是否尝试过使用FileDialog
的QML文件对话框selectFolder: true
?由于Qt5文档说
如果可能的话,FileDialog的实现将是一个平台文件对话框。如果不可能,那么它将尝试实例化QFileDialog。
由于目录集比QFileDialog使用更多的本机对话框,因此它可能对目录集更加用户友好。我在MacOS上尝试了一下,它完美地显示了您想要的行为,但是我附近没有Windows开发机,但是找到了一个最小的项目:
main.qml:
import QtQuick 2.2
import QtQuick.Controls 1.0
import QtQuick.Dialogs 1.2
ApplicationWindow
{
visible: true
width: 640
height: 480
title: qsTr("Minimal Qml")
FileDialog {
id: fileDialog
title: "Please choose a directory"
selectFolder: true
folder: shortcuts.home
onAccepted: {
console.log("You chose: " + fileDialog.fileUrls)
Qt.quit()
}
onRejected: {
console.log("Canceled")
Qt.quit()
}
Component.onCompleted: visible = true
}
}
main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("main.qml")));
return app.exec();
}
qml.qrc
<RCC>
<qresource prefix="⁄">
<file>main.qml</file>
</qresource>
</RCC>
CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
project(untitled1)
set(CMAKE_CXX_STANDARD 14)
find_package(Qt5 COMPONENTS Widgets Qml Quick REQUIRED)
include_directories(${Qt5Widgets_INCLUDE_DIRS} ${QtQml_INCLUDE_DIRS})
add_definitions(${Qt5Widgets_DEFINITIONS} ${QtQml_DEFINITIONS} ${${Qt5Quick_DEFINITIONS}})
qt5_add_resources(QT_RESOURCES qml.qrc)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(PROJECT "MinimalQml")
configure_file(main.qml main.qml COPYONLY)
add_executable(${PROJECT} main.cpp ${QT_RESOURCES})
target_link_libraries(${PROJECT}
Qt5::Widgets
Qt5::Qml
Qt5::Quick
)
答案 1 :(得分:1)
尽管有SHBrowseForFolder
个bug,我还是100%会喜欢它,因为临时用户一定会在IFileOpenDialog看到的只是一个空白区域时感到困惑。甚至我自己也偶尔会感到困惑。编码也更简单。
我总是将其与BIF_EDITBOX
配合使用,以允许高级用户快速输入路径,而且,我总是在另一个具有预选路径和“更改文件夹”按钮的对话框中使用它。
答案 2 :(得分:0)
主要问题是,如文档中所述,Windows的本机文件对话框仅在选择目录时不支持同时显示文件和目录(也请选中this other related answer)。对于QFileDialog::FileMode::Directory
:
目录名称。显示文件和目录。但是,本机Windows文件对话框不支持在目录选择器中显示文件。
一种解决方法是将非本机文件对话框用于这种选择,但是就个人而言,如果必须将其他本机文件对话框放在一起,则看起来很糟糕。
这里快速比较了两种选择目录的方法:使用QFileDialog::getExistingDirectory
,手动创建QFileDialog
的实例以及使用本地IFileDialog
:
browser.get('https://downloadgram.com/')
time.sleep(5)
element=browser.find_element_by_xpath("//div[starts-with(@id,'id')]" and "//div[starts-with(@style,'position:absolute !important;height:20px !important;width:20px !important;top:3px !important;left:3px !important;background-image:url(data:image/png;')]")
arrt=element.get_attribute("id")
print(arrt)
browser.execute_script("arguments[0].click();", element)