1.QT QFileDialog默认是不支持多目录选择的,网上其他实现方式界面都比较丑,网图:
2.参考MFC的多目录选择对话框,我采用了QT调用MCF库方式实现,QT和MFC参考大佬文章:
VS2017编写MFC库以及使用Qt调用MFC库方法_长沙红胖子Qt的博客-优快云博客_qt 调用lib
效果图:
首先上MFC实现代码
头文件:
extern "C" _declspec(dllexport) char * __stdcall OpenDirectory(char* title, char * dirpath);
Cpp文件:
char* __stdcall OpenDirectory(char* title, char* dirpath)
{
std::vector<CString>ans;
CString allpath = _T("");
CWnd* pWnd = NULL;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CFolderPickerDialog dlg(NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_ENABLESIZING, pWnd);
dlg.m_ofn.lpstrTitle = CString(title);
if (dlg.DoModal() == IDOK) {
POSITION pos = dlg.GetStartPosition();
while (pos) {
ans.push_back(dlg.GetNextPathName(pos));
}
}
for (std::vector<CString>::iterator iter = ans.begin(); iter != ans.end(); ++iter)
{
allpath = allpath + *iter + _T(";");
}
allpath= allpath.Left(allpath.GetLength() - 1);
int len = WideCharToMultiByte(CP_ACP, 0, allpath, -1, NULL, 0, NULL, NULL);
char* ptxtTemp = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, allpath, -1, ptxtTemp, len, NULL, NULL);
return ptxtTemp;
}
导出定义 .def
; OpenDirectoryLibrary.def: 声明 DLL 的模块参数。
LIBRARY
EXPORTS
; 此处可以是显式导出
OpenDirectory @ 1
最后:QT 端调用类
采用内联类,不说废话 直接上代码 ,动态库编译后放QT编译后程序运行目录下
#ifndef FOLDERMULTIDIALOG_H
#define FOLDERMULTIDIALOG_H
#include <QList>
#include <QString>
#include <QLibrary>
#include <QTextCodec>
#include <qDebug>
class FolderMultiDialog
{
public :
static QList<QString> FolderMultiDialog::getExistingDirectory(QString title= "选择目录")
{
QLibrary lib("OpenDirectoryLibrary.dll");
if (lib.load()) {
qDebug() << "load ok!";
}
else {
qDebug() << "load failed!";
}
typedef char* (*OpenDirectory)(const char*, const char*);
OpenDirectory fpAdd = (OpenDirectory)lib.resolve("OpenDirectory");
QTextCodec* pCodec = QTextCodec::codecForName("GBK");
QByteArray data = pCodec->fromUnicode(title);
char* titledata = data.data();
char* nSum = fpAdd(titledata, "");
QString selectdirs = QString::fromLocal8Bit(nSum);
QList<QString> selectdirlists = selectdirs.split(";");
lib.unload();//卸载
return selectdirlists;
}
};
#endif
QT下调用 超简单 一句话
#include "FolderMultiDialog.h"
QList<QString> dirs = FolderMultiDialog::getExistingDirectory("选择目录");