1.文档目的
数码相框程序在经过qt-embedded交叉编译之后,移植到开发板上发现当打开open键选择新图片文件夹路径时出现段错误。经过查找资料后分析得出,qt类QFileDialog在非X-server环境下无法初始化,因为其在初始化时需调用本地文件对话框。所以为了实现数码相框可选择新图片文件夹路径的功能,需要根据程序需要重写QFileDialog。
2.实现过程
1)文件对话框设计图1如下:
图1文件对话框
2)功能设计如下:
a.当数码相框程序点击open键之后,弹出文件对话框;
b.通过文本框中显示当前选中文件夹路径;
c.通过点击OK键实现将文本框中路径设置为新图片文件夹路径;
d.通过点击Cancle键实现取消选择功能;
e.通过单击文件夹列表中文件夹将焦点移植该文件夹,并在文本框中显示改文件夹全路径;
f.通过双击文件夹列表中文件夹实现进入该文件夹并更新文件夹列表信息;
g.通过双击文件夹列表中的“·”文件夹选择当前目录;
h.通过双击文件夹列表中的“··”文件夹返回上一级。
3)实现代码:
#include <QtGui>
#include <QDebug>
#include <QFileInfo>
#include <QListWidgetItem>
#include <QIcon>
#include "filedialog.h"
FileDialog::FileDialog(QWidget *parent)
: QWidget(parent)
{
//Dialog布局
setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
resize(320, 240);
this->move(0,0);
dir_name_edit=new QLineEdit;
ok_button=new QPushButton(tr("&Ok"));
cancel_button=new QPushButton(tr("&Cancle")) ;
QHBoxLayout *belowlayout=new QHBoxLayout;
belowlayout->addWidget(dir_name_edit);
belowlayout->addWidget(ok_button);
belowlayout->addWidget(cancel_button);
dir_name_edit->setText(dir);
dir_list=new QListWidget;
dir_list->setViewMode(QListView::ListMode);
dir_list->setMovement(QListView::Static);
dir_list->setResizeMode(QListView::Fixed);
dir_list->setFocusPolicy(Qt::NoFocus);
QGridLayout *layout=new QGridLayout;
layout->addLayout(belowlayout,0,0,1,3);
layout->addWidget(dir_list,1,0,3,3);
this->setLayout(layout);
//显示根目录文件夹列表
dir="/";
dirlist<<dir;
num=0;
QDir picdir(dir);
picdir.setFilter(QDir::Dirs|QDir::NoDotAndDotDot);
QFileInfoList list = picdir.entryInfoList();
for(int i=0;i<list.size();i++)
{
QFileInfo fileInfo0 = list.at(i);
QString path=fileInfo0.filePath();
path.replace(dir, QString(""));
path=path.remove(QChar('/'),Qt::CaseInsensitive);
QListWidgetItem *item = new QListWidgetItem;
item->setIcon(QIcon(":/folder.png"));
item->setText(path);
dir_list->insertItem((i+1),item);
}
//建立信号槽
connect(dir_list,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(oneClick(QListWidgetItem*)));
connect(dir_list,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleClick(QListWidgetItem*)));
connect(ok_button,SIGNAL(clicked()),this,SLOT(chooseNewDir()));
connect(cancel_button,SIGNAL(clicked()),this,SLOT(cancleChoose()));
}
//单击文件夹列表
void FileDialog::oneClick(QListWidgetItem* item_new)
{
qDebug("oneClick(QListWidgetItem* item_new)");
QString dir_name1;
dir_name1=item_new->text();
//dir_name_edit->setText(dir_name1);
if(dir_name1==".")
{
qDebug(".");
dir_name_lineE=dir;
}
else if(dir_name1=="..")
{
qDebug("..");
dir_name_lineE=dirlist.at(num-1);
}
else
{
qDebug("filedir");
dir_name_lineE=dir;
if(dir_name_lineE!="/")
{
dir_name_lineE+="/";
}
dir_name_lineE+=dir_name1;
}
dir_name_edit->setText(dir_name_lineE);
qDebug()<<dir_name_lineE;
}
//双击文件夹列表
void FileDialog::doubleClick(QListWidgetItem* item_new)
{
qDebug("onetwo");
QString dir_name2;
dir_name2=item_new->text();
if(dir_name2==".")
{
qDebug(".");
qDebug()<<dir;
qDebug()<<dir_name0;
dir_name0=dir;
}
else if(dir_name2=="..")
{
qDebug("..");
num--;
dir_name0=dirlist.at(num);
QStringList dirlist_cache;
for(int i=0;i<=num;i++)
{
dirlist_cache<<dirlist.at(i);
qDebug()<<dirlist.at(i);
}
dirlist.clear();
dirlist<<dirlist_cache;
dir=dir_name0;
qDebug("num..=%d",num);
}
else
{
qDebug("filedir");
dir_name0=dir;
if(dir_name0!="/")
{
dir_name0+="/";
}
dir_name0+=dir_name2;
dir=dir_name0;
dirlist<<dir;
num++;
qDebug("num-file=%d",num);
}
QDir picdir(dir);
if(dir=="/")
{
picdir.setFilter(QDir::Dirs|QDir::NoDotAndDotDot);
}
else
{
picdir.setFilter(QDir::Dirs);
}
QFileInfoList list = picdir.entryInfoList();
dir_list->clear();
for(int i=0;i<list.size();i++)
{
QFileInfo fileInfo0 = list.at(i);
QString path=fileInfo0.filePath();
path.replace(dir, QString(""));
path=path.remove(QChar('/'),Qt::CaseInsensitive);
QListWidgetItem *item = new QListWidgetItem;
item->setIcon(QIcon(":/folder.png"));
item->setText(path);
dir_list->insertItem((i+1),item);
}
}
//OK键选择返回新图片文件夹路径
void FileDialog::chooseNewDir()
{
qDebug("chooseNewDir()");
qDebug()<<dir_name_lineE;
emit newDir(dir_name_lineE);
this->close();
}
//Cancle取消选择文件夹
void FileDialog::cancleChoose()
{
qDebug("cancleChoose()");
QString nullDir=NULL;
qDebug()<<nullDir;
emit newDir(nullDir);
this->close();
}