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

如下图所示,需求是同时能够选择文件或者文件夹,但是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);
                    }
                }

            }
        }
    }
}

 

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章