Qt实现多选文件夹对话框

简述

Qt使用QFileDialog类可以实现文件选择对话框,多文件选择对话框,以及文件夹选择对话框,就是没有多文件夹选择对话框,做的并不是很完美无法直接调用win下的原生对话框,下面将介绍一下Qt实现多选文件夹对话框的两种方式。

目录

  • 使用QTreeView和QListView实现
  • 调用MFC程序实现

方法一

使用以下代码可实现弹出文件夹多选对话框,但是此文件夹对话框有很多问题

  • 界面样式很丑!
  • 在某一台win电脑使用的时候会导致对话框打开后卡死,暂不清楚问题所在!
 const QStringList fileDialog::openDirListDialog()
{
    QFileDialog dialog(0, QObject::tr("Please select folder"), "./");
    dialog.setWindowFlags(Qt::WindowStaysOnTopHint);
    dialog.setOption(QFileDialog::DontUseNativeDialog, true);
    dialog.setFileMode(QFileDialog::DirectoryOnly);

    QListView *listView = dialog.findChild<QListView*>();
    QTreeView *treeView = dialog.findChild<QTreeView*>();

    if (listView && treeView) {
        listView->setSelectionMode(QAbstractItemView::ExtendedSelection);
        treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);

        if(dialog.exec()) {
            return dialog.selectedFiles();
        }
    }

    return QStringList();
}

以下对话框样式为上述代码所调用!
在这里插入图片描述

方法二

1.在MFC下其实实现多选文件夹对话框并不难,使用如下代码在mfc下可直接调用。

#include "stdafx.h"
std::vector<CString> Get_path_dlg(HWND hwndOwner)
{
	std::vector<CString> ans;
 
	CWnd * pWnd = hwndOwner != NULL ? CWnd::FromHandle(hwndOwner) : NULL;
 
	CFolderPickerDialog dlg(NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_ENABLESIZING, pWnd);
	if (dlg.DoModal() == IDOK) {
		POSITION pos = dlg.GetStartPosition();
		while (pos) {
			ans.push_back(dlg.GetNextPathName(pos));
		}
	}
 
	return ans;
}

2.这里为了方便用Qt调用,这里吧mfc程序做成了socket客户端,Qt程序为服务端,进行发消息调用函数后返回路径写给服务端,以下为mfc代码和Qt调用方式。
①gitee地址
https://gitee.com/xiaoxin5210/DirListDialog
此地址包含mfc代码以及一个已编译出的.exe程序可通过Qt直接调用。
②使用Qt调用exe来打开对话框

//初始化服务端
void fileDialog::initServer()
{
    QProcess* process = new QProcess(this);
    process->start("taskkill -f -im *.exe"); //此exe名需自行修改,启动前先清空此程序
    process->waitForFinished();
	//QTcpServer* server;头文件包含
    server = new QTcpServer(this);
    server->listen(QHostAddress::Any, 11020);
    connect(server, SIGNAL(newConnection()), this ,SLOT(onNewConnect()));
    
    QProcess* p = new QProcess();
    p->start("./CloudTransferTools", QStringList() << "123");
}

void fileDialog::onNewConnect()
{
    qDebug() << "与对话框程序连接成功";
    isConnect = true;
    //QTcpSocket* socket;头文件包含
    socket = server->nextPendingConnection();
    connect(socket, SIGNAL(readyRead()), this, SLOT(onRead()));
}

//调用函数
void fileDialog::openDirListDialog()
{
    if (!isConnect) { //这边是我的一个自行判断如果连接上此bool为true,如果连接不上发出去另作处理
        emit signalSendDirPathList(QStringList(), isConnect);
        return;
    }
    //如果连接上发送1,可自行编译mfc代码修改数据
    socket->write("1");
}
//接收返回的路径
void fileDialog::onRead()
{
    qint64 buf = socket->bytesAvailable();
    QStringList dirPathList = QString::fromLocal8Bit(socket->read(buf)).split('|');
    if (dirPathList.last() == "") {
        dirPathList.removeLast();
    }
    emit signalSendDirPathList(dirPathList, isConnect);
}

以下图片为上述MFC程序打开的对话框!
在这里插入图片描述

结尾

以上为Qt调用多选文件夹对话框的两种方式,尝试过重写QFileDialong,看源码,始终在qt里面无法调用原生对话框,表示遗憾,以上代码拓展性较高自行修改。

新手上路,有不足或者有错误的地方还需大佬指教。

感谢阅读。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值