Qt4、QT5、 Linux、ARM、Windows通用自定义文件读取框,文件对话框,文件筛选框,仿QFileDialog

用QtableWidget实现通用的文件读取框

在Linux下无法使用QFileDialog函数,就没有办法做到自己选择要读取的文件,对此我们进行自定义实现,实现一个通用的文件读取框


前言

QT4与QT5对于文件操作,基本没什么变化,对于ARM来说他是无法调用QFileDialog这个文本对话框的,但我们在ARM也要选择读取文件啊,图片啊等等,这里就需要我们自己去实现。


提示:以下是本篇文章正文内容,下面案例可供参考

一、为什么采用Tablewidget不使用listview自带的函数

ListView自带的访问路径,只能获取传入路径层,里面的函数可能还需要自己修改Listview控件,所以这里我们采用最简单的方法,用TableWidget与QDirInfo来实现与Windows下相同的文件对话框。

下面是显示效果,界面优化什么的自己做就好。
在这里插入图片描述

二、实现思想

1.做成通用的对话框,软件每个都可以调用

首先将传入路径开放,上层类可以直接调用。因为传入路径时,一般都是直接显示筛选出的文件的,所我们直接进行显示,这个接口为通用接口,显示上层文件,显示下层文件都调用这个接口,isUp代表是否切换上层路径,可以直接调用Qdir的函数cdup,

代码如下:

void FileDialog::FileFiter(QString str_Path, bool isUp)
{
    
    
    QDir dir(str_Path);
    if(isUp)
    {
    
    
        dir.cdUp();
    }
    QFileInfoList files = dir.entryInfoList(QDir::Dirs|QDir::Files, QDir::DirsFirst);
    if(files.size() <= 2)
    {
    
    
        return;
    }
    int count =0;
    m_FilePath  =  dir.path();
    m_Filenamemap.clear();
    ui->tw_fileview->clear();
    ui->tw_fileview->setColumnCount(1);
    //遍历当前文件价下所有文件
    for(int fileat = 0;fileat<files.size();fileat++)
    {
    
    
        //去掉遍历出的两个固定
        if(files.at(fileat).fileName() == "."||files.at(fileat).fileName() == "..")
        {
    
    
            continue;
        }
        //判断文件是否符合条件  必须是文件夹与设定条件  不设置条件直接显示
        if(m_FiterFactor != "")
        {
    
    
            if(!files.at(fileat).fileName().endsWith(m_FiterFactor)&&!files.at(fileat).isDir())
            {
    
    
                continue;
            }
        }
        ui->tw_fileview->setRowCount(1+count);
        m_Filenamemap[files.at(fileat).fileName()] = files.at(fileat);
        ui->tw_fileview->setItem(count,0,new QTableWidgetItem(files.at(fileat).fileName()));
       // ui->tw_fileview->setItem(count,1,new QTableWidgetItem(files.at(fileat).lastModified().toString("yyyy MM/dd/yy h:mm")));
        count++;
    }
    ui->lb_currentPath->setText(m_FilePath);
}

在开放了路径后,我们还想实现文件筛选的功能,这里开放筛选条件的接口

void FileDialog::SetFiterFactor(QString str_Fiter)
{
    
    
    m_FiterFactor =  str_Fiter;
}

2.具体文件

头文件如下:

扫描二维码关注公众号,回复: 12565613 查看本文章
#ifndef FILEDIALOG_H
#define FILEDIALOG_H

#include <QDialog>
#include <QDirModel>
#include <QAbstractItemModel>
#include <QDir>
namespace Ui {
    
    
class FileDialog;
}

class FileDialog : public QDialog
{
    
    
    Q_OBJECT

public:
    explicit FileDialog(QWidget *parent = 0);
    ~FileDialog();
    //设置筛选条件
    void SetFiterFactor(QString Fiter);
    //设置文件路径过滤当前文件夹下所有文件   Isup是判断是否为返回上一层文件
    void FileFiter(QString Path,bool isUp =false);
private slots:
    void on_bt_cdup_clicked();

    void on_bt_cddown_clicked();

    void on_bt_open_clicked();
signals:
    void returnFilePath(const QString path);
private:
    std::map<QString,QFileInfo> m_Filenamemap; //当前文件夹下所有文件
    QString m_FilePath;      //当前文件路径
    QString m_FiterFactor;  //文件筛选条件
    Ui::FileDialog *ui;
};

#endif // FILEDIALOG_H


cpp文件如下:

#include "filedialog.h"
#include "ui_filedialog.h"
#include <QDateTime>
FileDialog::FileDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::FileDialog)
{
    
    
    ui->setupUi(this);

    m_FiterFactor =".txt";
    m_FilePath = QDir::currentPath() ;
    FileFiter(m_FilePath);
    ui->tw_fileview->horizontalHeader()->setResizeMode(QHeaderView::Stretch);    //x先自适应宽度
    ui->tw_fileview->setSelectionBehavior(QAbstractItemView::SelectRows);//整行选择
    ui->tw_fileview->setSelectionMode(QAbstractItemView::SingleSelection);//只能单行选择
}

FileDialog::~FileDialog()
{
    
    
    delete ui;
}

void FileDialog::SetFiterFactor(QString Fiter)
{
    
    
    m_FiterFactor =  Fiter;
}

void FileDialog::FileFiter(QString Path, bool isUp)
{
    
    
    QDir dir(Path);
    if(isUp)
    {
    
    
        dir.cdUp();
    }
    QFileInfoList files = dir.entryInfoList(QDir::Dirs|QDir::Files, QDir::DirsFirst);
    if(files.size() == 2)
    {
    
    
        return;
    }
    int count =0;
    m_FilePath  =  dir.path();
    m_Filenamemap.clear();;
    ui->tw_fileview->clear();
    ui->tw_fileview->setRowCount(100);
    ui->tw_fileview->setColumnCount(2);
    //遍历当前文件价下所有文件
    for(int fileat = 0;fileat<files.size();fileat++)
    {
    
    
        //去掉遍历出的两个固定
        if(files.at(fileat).fileName() == "."||files.at(fileat).fileName() == "..")
        {
    
    
            continue;
        }
        //判断文件是否符合条件  必须是文件夹与设定条件  不设置条件直接显示
        if(m_FiterFactor != "")
        {
    
    
            if(!files.at(fileat).fileName().endsWith(m_FiterFactor)&&!files.at(fileat).isDir())
            {
    
    
                continue;
            }
        }
        m_Filenamemap[files.at(fileat).fileName()] = files.at(fileat);
        ui->tw_fileview->setItem(count,0,new QTableWidgetItem(files.at(fileat).fileName()));
        ui->tw_fileview->setItem(count,1,new QTableWidgetItem(files.at(fileat).lastModified().toString("yyyy MM/dd/yy h:mm")));
        count++;
    }
    ui->lb_currentPath->setText(m_FilePath);
}

void FileDialog::on_bt_cdup_clicked()
{
    
    
    //返回上一路径
    FileFiter(m_FilePath,true);
}

void FileDialog::on_bt_cddown_clicked()
{
    
    
    //获取当前行的路径
    int row =ui->tw_fileview->currentRow();
    if(ui->tw_fileview->item(row,0) !=NULL)
    {
    
    
        if(m_Filenamemap.find(ui->tw_fileview->currentItem()->text()) ==m_Filenamemap.end())
            return;
        QFileInfo fileInfo =  m_Filenamemap[ui->tw_fileview->currentItem()->text()];
        if(fileInfo.isDir())
        {
    
    
            QString  path =fileInfo.filePath();
            FileFiter(path);
        }

    }
}

void FileDialog::on_bt_open_clicked()
{
    
    
    //获取当前行的路径
    int row =ui->tw_fileview->currentRow();
    if(ui->tw_fileview->item(row,0) !=NULL)
    {
    
    
       if(m_Filenamemap.find(ui->tw_fileview->currentItem()->text()) ==m_Filenamemap.end())
           return;
        QFileInfo fileInfo =  m_Filenamemap[ui->tw_fileview->currentItem()->text()];
        QString  path =fileInfo.filePath();
        returnFilePath(path);

    }
}

猜你喜欢

转载自blog.csdn.net/amxld/article/details/111032848