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

时间:2019-02-14 15:37:27

标签: c++ windows qt winapi

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

因此,我决定深入研究它并进行一些研究。从我发现的内容来看,似乎基本上有两个选择。 IFileOpenDialogFOS_PICKFOLDERS,这是我目前通过qt的QFileDialog使用的。或SHBrowseForFolder,它确实有效,但功能有限。

我缺少任何选择吗?似乎IFileOpenDialog在没有允许用户选择的情况下显示文件是理想的。有什么办法可以做到这一点?我发现很多较旧的信息说这是不可能的,但是没有确切的信息是最新的。

3 个答案:

答案 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)