C++选择文件夹,包含文件

the*_*220 5 c++ windows winapi qt

我目前正在研究Windows的qt应用程序.用户需要能够选择一个目录来加载所有文件.我遇到了与此相关的问题.这看起来很愚蠢,但我一直得到同样的反馈.最终用户对文件对话框感到困惑,因为它们导航到该文件夹​​,但它不显示任何文件.即使他们正在选择一个文件夹,它也会使他们感到困惑,因为他们看不到目录中的文件.

所以我决定深入研究并做一些研究.从我发现的情况来看,似乎基本上有两种选择.在IFileOpenDialogFOS_PICKFOLDERS,这是我目前通过Qt的使用的是什么QFileDialog.或者SHBrowseForFolder,它确实有效,但非常有限.

我错过了任何选择吗?似乎IFileOpenDialog显示文件而不允许用户选择它们将是理想的.有没有办法实现这个目标?我发现很多旧的信息说这是不可能的,但没有确定的更新近.

Sup*_*kus 1

FileDialog您是否尝试过QML 文件对话框selectFolder: true?由于 Qt5 文档说

\n\n
\n

如果可能的话,FileDialog 的实现将是一个平台文件对话框。如果这是不可能的,那么它将尝试实例化 QFileDialog。

\n
\n\n

对于目录集来说,它可能对用户更友好,因为它使用比 QFileDialog 更原生的对话框。我在 MacOS 上尝试过,它完美地显示了您想要的行为,但我附近没有 Windows 开发机器,但找到了一个附加的最小项目:

\n\n

主要.qml:

\n\n
import QtQuick 2.2\nimport QtQuick.Controls 1.0\nimport QtQuick.Dialogs 1.2\n\nApplicationWindow\n{\n    visible: true\n    width: 640\n    height: 480\n    title: qsTr("Minimal Qml")\n    FileDialog {\n        id: fileDialog\n        title: "Please choose a directory"\n        selectFolder: true\n        folder: shortcuts.home\n        onAccepted: {\n            console.log("You chose: " + fileDialog.fileUrls)\n            Qt.quit()\n        }\n        onRejected: {\n            console.log("Canceled")\n            Qt.quit()\n        }\n        Component.onCompleted: visible = true\n    }\n}   \n
Run Code Online (Sandbox Code Playgroud)\n\n

主程序

\n\n
#include <QApplication>\n#include <QQmlApplicationEngine>\nint main(int argc, char** argv)\n{\n    QApplication app(argc, argv);\n    QQmlApplicationEngine engine;\n    engine.load(QUrl(QStringLiteral("main.qml")));\n    return app.exec();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

qml.qrc

\n\n
<RCC>\n    <qresource prefix="\xe2\x81\x84">\n        <file>main.qml</file>\n    </qresource>\n</RCC>\n
Run Code Online (Sandbox Code Playgroud)\n\n

CMakeLists.txt

\n\n
cmake_minimum_required(VERSION 3.13)\nproject(untitled1)\n\nset(CMAKE_CXX_STANDARD 14)\n\nfind_package(Qt5 COMPONENTS Widgets Qml Quick REQUIRED)\n\n\ninclude_directories(${Qt5Widgets_INCLUDE_DIRS} ${QtQml_INCLUDE_DIRS})\nadd_definitions(${Qt5Widgets_DEFINITIONS} ${QtQml_DEFINITIONS} ${${Qt5Quick_DEFINITIONS}})\nqt5_add_resources(QT_RESOURCES qml.qrc)\nset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")\nset(CMAKE_AUTOMOC ON)\nset(CMAKE_AUTORCC ON)\nset(CMAKE_AUTOUIC ON)\nset(PROJECT "MinimalQml")\n\nconfigure_file(main.qml main.qml COPYONLY)\n\nadd_executable(${PROJECT} main.cpp ${QT_RESOURCES})\ntarget_link_libraries(${PROJECT}\n        Qt5::Widgets\n        Qt5::Qml\n        Qt5::Quick\n        )\n
Run Code Online (Sandbox Code Playgroud)\n