我们的应用程序将其项目保存为一个包含实际项目文件something.abc
的文件夹在加载项目时,我们必须进入项目文件夹并找到项目文件。我知道有文件夹选择操作系统对话框但我只想让它工作,如果它可以看到文件夹中存在文件。
我确定我已经看到了这一点,但我不知道我们是如何使用Qt的,但是对于Windows或者本机的Windows的答案是受欢迎的。一件事是我想使用本机操作系统对话框,而不是从头开始构建我自己的对话框。
答案 0 :(得分:6)
Win32 SHBrowseForFolder()
和IFileOpenDialog
API都允许用户选择文件夹。
这两个API都允许您对对话事件做出反应,例如当前文件夹选择的更改,当前选择的验证等。SHBrowseForFolder()
具有回调函数,IFileOpenDialog
具有{{1接收器接口。
这样的回调/接收器可以检查当前选择的文件夹是否具有给定的文件类型,然后阻止或允许对话框将该结果返回给调用者。
IFileDialogEvents
检查文件类型是否存在:
SHBrowseForFolder()
来获取文件夹的文件系统路径。SHGetPathFromIDList()
使用所需的文件名模式掩码搜索该路径。 或
FindFirstFile()
来检索IShellFolder
界面(或者,在Vista之前的系统上,使用SHBindToObject()
获取SHGetDesktopFolder()
顶级Desktop shell命名空间,然后将PIDL传递给其IShellFolder
方法。BindToObject()
方法获取其IShellFolder::EnumObjects()
接口。IEnumIDList
方法枚举文件的相对PIDL,以查找与所需文件名模式匹配的文件。要阻止或允许对话框将成功返回给调用者,回调函数可以处理IShellFolder::GetDisplayNameOf()
通知以根据需要验证文件夹,然后向对话框窗口发送BFFM_SELCHANGED
消息{ {1}}相应地设置为零或非零。
BFFM_ENABLEOK
检查文件类型是否存在:
lParam
方法检索其IFileOpenDialog
界面。IShellItem::BindToHandler()
接口,使用IEnumShellItems
方法查找与所需文件名模式匹配的文件。要阻止或允许对话框将成功返回给调用者,接收器可以实现IShellItem
事件以验证所选文件夹并根据需要返回IShellItem::GetDisplayName()
或OnFileOk
。
或者,接收器可以实现S_OK
事件以直接启用/禁用对话框的确定按钮(S_FALSE
在这种情况下不起作用):
OnFolderChange
界面的对话框,然后调用其IFileDialogCustomize::SetControlState()
方法来检索对话框的HWND
。IOleWindow
函数使用标准GetWindow()
控件ID获取OK按钮的GetDlgItem()
。HWND
函数启用/禁用按钮。