用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.具体文件
头文件如下:
#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);
}
}