如下图所示,需求是同时能够选择文件或者文件夹,但是QFileDialog文件窗口类要么只能选文件,要么只能选文件夹,无法同时去选择文件和文件夹;

要实现这样的需求,封装了一个类,实现同时选择文件和文件夹;

头文件

#ifndef MULTIFILEDIRDIALOG_H
#define MULTIFILEDIRDIALOG_H #include <QObject>
#include <QFileDialog>
class MultiFileDirDialog : public QFileDialog
{
Q_OBJECT public:
MultiFileDirDialog(QWidget *parent);
~MultiFileDirDialog();
QStringList m_listSelect;
signals: public slots :
void go(); private: }; #endif // MULTIFILEDIRDIALOG_H

源文件

#include "MultiFileDirDialog.h"
#include<QListView>
#include <QTreeView>
#include <QDialogButtonBox>
#include <QTranslator>
#include <QPushButton>
#include <QDialogButtonBox>
#pragma execution_character_set("utf-8")
MultiFileDirDialog::MultiFileDirDialog(QWidget *parent)
: QFileDialog(parent)
{ setOption(QFileDialog::DontUseNativeDialog, true);
//支持多选
QListView *listView = findChild<QListView*>("listView");
if (listView)
listView->setSelectionMode(QAbstractItemView::ExtendedSelection);
QTreeView *treeView = findChild<QTreeView*>();
if (treeView)
treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
QDialogButtonBox *button = findChild<QDialogButtonBox *>("buttonBox"); if (button)
{
/*QPushButton* selectbutton = button->button(QDialogButtonBox::Open);
if (selectbutton)
{
button->removeButton(selectbutton);
const QString strselect = "选择";
selectbutton = button->addButton(QDialogButtonBox::Ok);
selectbutton->setText("选择");
}
QPushButton* canclebutton = button->button(QDialogButtonBox::Cancel);
if (canclebutton)
{
button->removeButton(canclebutton);
const QString strcalcel = "取消";
canclebutton=button->addButton(strcalcel, QDialogButtonBox::RejectRole);
canclebutton->setText("取消");
}*/
button->clear();
QPushButton* accpetbutton = new QPushButton(button);
accpetbutton->setText("确定");
button->addButton((QAbstractButton*)accpetbutton, QDialogButtonBox::AcceptRole);
QPushButton* cancel = new QPushButton(button);
cancel->setText("取消");
button->addButton((QAbstractButton*)cancel, QDialogButtonBox::RejectRole);
/*button->button(QDialogButtonBox::Ok)->setText(tr("确定"));
button->button(QDialogButtonBox::Cancel)->setText(tr("取消"));*/
disconnect(button, SIGNAL(accepted()), this, SLOT(accept()));//使链接失效
connect(button, SIGNAL(accepted()), this, SLOT(go()));//改成自己的槽
}
//无效
//setLabelText(QFileDialog::FileName, "选择文件:");//英文化文件名称
//setLabelText(QFileDialog::Reject, "取消");//英文化取消按钮
//setLabelText(QFileDialog::Accept, "选择");//英文化打开按钮 } MultiFileDirDialog::~MultiFileDirDialog()
{ }
void MultiFileDirDialog::go()
{
m_listSelect = selectedFiles();
QDialog::accept();
}

其中默认的取消确认按钮始终无法显示中文,所以直接将默认的按钮清除掉,再自己添加两个按钮上去,建立信号槽连接就可以了;

再需求导入选择文件的地方调用创建对象调用;

void AddVedioAnaTask::OnBtnSelectClicked()
{
//ps/ts/hik/mp4/asf/avi/dahv/flv
if (m_addType==0)//导入案件
{
m_pMultiFileDialog->setOption(QFileDialog::ShowDirsOnly, true);
//m_pMultiFileDialog->setFileMode(QFileDialog::Directory);
}
else//导入子文件
{
//m_pMultiFileDialog->setFileMode(QFileDialog::AnyFile);
m_pMultiFileDialog->setOption(QFileDialog::ShowDirsOnly, false);
m_pMultiFileDialog->setNameFilter("vedio(*.mp4 *.avi *.dav *.asf *.wmv *.mpg *.ts *.3g2 *.swf *.flv *.m2ts *.mkv *.3gp *.vob *.rmvb *.mov *.webm *.rm *.mts *.mpeg *.264 *.692 *.800 *.801 *.av *.avx *.djl *.dvr *.g64 *.h3crd *.h64 *.h264 *.ifv *.jmv *.kyd *.lvf *.mpk *.nsf *.nv4 *.ps *.rec *.sdv *.sv5 *.swf *.tm4 *.tp *.bhd *.dat *.h265 *.he4 *.m4c *.pep *.smf *.sv4 *.vdg *.601 *.452094848)");
} if (m_pMultiFileDialog->exec() == QDialog::Accepted)
{
QStringList selectFiles = m_pMultiFileDialog->selectedFiles();
if (selectFiles.size() > 0)
{
QString strItem = "";
for (int i = 0; i < selectFiles.size(); i++)
{
strItem = selectFiles[i];
if (!strItem.isEmpty())
{
if (m_TaskFileMap.find(strItem) == m_TaskFileMap.end())
{
addFileToTable(strItem);
}
} }
}
}
}

}

}

QFileDialog实现同时选择文件和文件夹,确认取消按钮英文问题解决方法的更多相关文章

  1. windows新建或者重命名文件及目录必须手动刷新才干显示出来问题解决方法

     首先推断注冊表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Update\UpdateMode值是否为0,该值若为1表示手工刷新, 该 ...

  2. 使用shiro安全框架上传文件时用HttpSession获取ServletContext为null问题解决方法。

    <!--在shiroFilter 中加入一下配置--> <init-param> <param-name>targetFilterLifecycle</par ...

  3. MFC 使用MFC EditBrowse Control控件选择文件或者文件夹

    从工具箱中拖拽一个MFC EditBrowse Control到窗体中, 通过设置“Browse Mode”属性指定“文件浏览”还是“文件夹浏览” 可以通过添加对象的方式将其与一个CString se ...

  4. (WPF) 文件和文件夹选择对话框。

    点击button,选择一个excel文件,并将文件名显示在textbox上. private void btnSelectErrorTableFile_Click(object sender, Rou ...

  5. Windows Store App JavaScript 开发:选取文件和文件夹

    前面提到过,文件打开选取器由FileOpenPicker类表示,用于选取或打开文件,而文件夹选取器由FolderPicker类表示,用来选取文件夹.在FileOpenPicker类中,pickSing ...

  6. 如何为基于windows验证的站点的某个页面、文件或文件夹单独设置匿名访问

    在MOSS的项目中,我们经常碰到要单独为基于windows验证的站点的某个页面.文件或文件夹单独设置匿名访问即不登录就可以直接访问.比如说站点的A的某些图片或文件URL存在B站点下的文件夹下.此时访问 ...

  7. Linux下查看文件和文件夹大小

     当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...

  8. Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)

    OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname")  改变当前脚本工作目 ...

  9. 【转】Linux下查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...

  10. 完美隐藏win7文件和文件夹

    有没有一种方法即使使用隐藏模式也不能查看, 没错可以用上帝模式....... 啥是Win7上帝模式?不知道的看看..... <<<<<<<<<&l ...

随机推荐

  1. 干电池升压IC或者干电池升压芯片

    1, 干电池升压IC                            升压输出3V,3,3V,5V等3V-5V可调 2, 单节锂电池升压IC                     升压输出4. ...

  2. Ubuntu20.04 Java相关环境(JDK、Mysql、Redis、nacos、influxdb)部署以及运行

    重装了系统,系统版本号为:Ubuntu20.04 1.云平台 登录云平台,选择要重装的服务器,关机.一键重装即可 2.安装jdk 下载jdk-8u341-linux-x64.tar.gz,并复制到服务 ...

  3. python 错误之TypeError: XXXXX() takes no keyword arguments

    举个例子: str1 = 'sunlightn' f = str1.rfind("n", __start=1, __end=2) print(f) 以上代码运行后出现: " ...

  4. uniapp微信小程序 下拉刷新(上拉请求下一页数据)

    <template>标签中: <view class="" v-if="daShow==1"> <view class=" ...

  5. overflow_auto在flex_1的容器失效

    旧文章从语雀迁移过来,原日期为2022-02-22 我们经常使用flex:1来动态分配父容器剩余空间,这时候如果要在容器上增加滚动条,使用overflow: auto可能会失效. 原因: 一般原因:因 ...

  6. 浅谈Java并发

    Java并发是比较难的知识点,难于对并发的理解.并发要从操作系统和硬件层面去理解,才会比较深入,而不单单是从编程语言的逻辑去理解. 首先对于并发要清楚的几点: 线程可能在任何时刻被切换.计算机只对硬件 ...

  7. [编程基础] Python数据生成库Faker总结

    Python Faker教程展示了如何使用Faker软件包在Python中生成伪数据.我们使用joke2k/faker包. 1 介绍 Faker是一个生成假数据的Python库.伪数据通常用于测试或用 ...

  8. [OpenCV实战]46 在OpenCV下应用图像强度变换实现图像对比度均衡

    本文主要介绍基于图像强度变换算法来实现图像对比度均衡.通过图像对比度均衡能够抑制图像中的无效信息,使图像转换为更符合计算机或人处理分析的形式,以提高图像的视觉价值和使用价值.本文主要通过OpenCV ...

  9. linux配置本地yum源实现在局域网中在线安装软件包

    安装linux下安装软件需要安装一系列的rpm包,用rpm -ivh xx和yum install xx 如果用rpm安装软件包的时候,需要自己下载rpm安装包,如果rpm包不全总是提示依赖检查失败或 ...

  10. 深入理解IOC并自己实现IOC容器

    title: 深入理解IOC并自己实现IOC容器 categories: 后端 tags: - .NET 背景介绍 平时开发的时候我们经常会写出这种代码: var optionA=new A(...) ...