打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
QT重写filedialog文件对话框

1.文档目的

数码相框程序在经过qt-embedded交叉编译之后,移植到开发板上发现当打开open键选择新图片文件夹路径时出现段错误。经过查找资料后分析得出,qtQFileDialog在非X-server环境下无法初始化,因为其在初始化时需调用本地文件对话框。所以为了实现数码相框可选择新图片文件夹路径的功能,需要根据程序需要重写QFileDialog

2.实现过程

1) 文件对话框设计图1如下:

文件对话框

2) 功能设计如下:

a. 当数码相框程序点击open键之后,弹出文件对话框;

b. 通过文本框中显示当前选中文件夹路径;

c. 通过点击OK键实现将文本框中路径设置为新图片文件夹路径;

d. 通过点击Cancle键实现取消选择功能;

e. 通过单击文件夹列表中文件夹将焦点移植该文件夹,并在文本框中显示改文件夹全路径;

f. 通过双击文件夹列表中文件夹实现进入该文件夹并更新文件夹列表信息;

g. 通过双击文件夹列表中的“·”文件夹选择当前目录;

h. 通过双击文件夹列表中的“··”文件夹返回上一级。

3) 实现代码:

  1. #include <QtGui>  
  2. #include <QDebug>  
  3. #include <QFileInfo>  
  4. #include <QListWidgetItem>  
  5. #include <QIcon>  
  6. #include "filedialog.h"  
  7. FileDialog::FileDialog(QWidget *parent)  
  8.   : QWidget(parent)  
  9. {  
  10.   //Dialog布局  
  11.   setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);  
  12.   resize(320, 240);  
  13.   this->move(0,0);  
  14.   dir_name_edit=new QLineEdit;  
  15.   ok_button=new QPushButton(tr("&Ok"));  
  16.   cancel_button=new QPushButton(tr("&Cancle")) ;  
  17.   QHBoxLayout *belowlayout=new QHBoxLayout;  
  18.   belowlayout->addWidget(dir_name_edit);  
  19.   belowlayout->addWidget(ok_button);  
  20.   belowlayout->addWidget(cancel_button);  
  21.   dir_name_edit->setText(dir);  
  22.   dir_list=new QListWidget;  
  23.   dir_list->setViewMode(QListView::ListMode);  
  24.   dir_list->setMovement(QListView::Static);  
  25.   dir_list->setResizeMode(QListView::Fixed);  
  26.   dir_list->setFocusPolicy(Qt::NoFocus);  
  27.   QGridLayout *layout=new QGridLayout;  
  28.   layout->addLayout(belowlayout,0,0,1,3);  
  29.   layout->addWidget(dir_list,1,0,3,3);  
  30.   this->setLayout(layout);  
  31.     
  32.   //显示根目录文件夹列表  
  33.   dir="/";  
  34.   dirlist<<dir;  
  35.   num=0;  
  36.   QDir picdir(dir);  
  37.   picdir.setFilter(QDir::Dirs|QDir::NoDotAndDotDot);  
  38.   QFileInfoList list = picdir.entryInfoList();  
  39.   for(int i=0;i<list.size();i++)  
  40.   {  
  41.       QFileInfo fileInfo0 = list.at(i);  
  42.       QString path=fileInfo0.filePath();  
  43.       path.replace(dir, QString(""));  
  44.       path=path.remove(QChar('/'),Qt::CaseInsensitive);  
  45.       QListWidgetItem *item = new QListWidgetItem;  
  46.       item->setIcon(QIcon(":/folder.png"));  
  47.       item->setText(path);  
  48.       dir_list->insertItem((i+1),item);  
  49.   }  
  50.   //建立信号槽  
  51.   connect(dir_list,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(oneClick(QListWidgetItem*)));  
  52.   connect(dir_list,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleClick(QListWidgetItem*)));  
  53.   connect(ok_button,SIGNAL(clicked()),this,SLOT(chooseNewDir()));  
  54.   connect(cancel_button,SIGNAL(clicked()),this,SLOT(cancleChoose()));  
  55. }  
  56. //单击文件夹列表  
  57. void FileDialog::oneClick(QListWidgetItem* item_new)  
  58. {  
  59.   qDebug("oneClick(QListWidgetItem* item_new)");  
  60.   QString dir_name1;  
  61.   dir_name1=item_new->text();  
  62.   //dir_name_edit->setText(dir_name1);  
  63.   if(dir_name1==".")  
  64.   {  
  65.       qDebug(".");  
  66.       dir_name_lineE=dir;  
  67.   }  
  68.   else if(dir_name1=="..")  
  69.   {  
  70.       qDebug("..");  
  71.       dir_name_lineE=dirlist.at(num-1);  
  72.   }  
  73.   else  
  74.   {  
  75.       qDebug("filedir");  
  76.       dir_name_lineE=dir;  
  77.       if(dir_name_lineE!="/")  
  78.       {  
  79.           dir_name_lineE+="/";  
  80.       }  
  81.       dir_name_lineE+=dir_name1;  
  82.   }  
  83.   dir_name_edit->setText(dir_name_lineE);  
  84.   qDebug()<<dir_name_lineE;  
  85. }  
  86. //双击文件夹列表  
  87. void FileDialog::doubleClick(QListWidgetItem* item_new)  
  88. {  
  89.   qDebug("onetwo");  
  90.   QString dir_name2;  
  91.   dir_name2=item_new->text();  
  92.   if(dir_name2==".")  
  93.   {  
  94.       qDebug(".");  
  95.       qDebug()<<dir;  
  96.       qDebug()<<dir_name0;  
  97.       dir_name0=dir;  
  98.   }  
  99.   else if(dir_name2=="..")  
  100.   {  
  101.       qDebug("..");  
  102.       num--;  
  103.       dir_name0=dirlist.at(num);  
  104.       QStringList dirlist_cache;  
  105.       for(int i=0;i<=num;i++)  
  106.       {  
  107.           dirlist_cache<<dirlist.at(i);  
  108.           qDebug()<<dirlist.at(i);  
  109.       }  
  110.       dirlist.clear();  
  111.       dirlist<<dirlist_cache;  
  112.       dir=dir_name0;  
  113.       qDebug("num..=%d",num);  
  114.   }  
  115.   else  
  116.   {  
  117.       qDebug("filedir");  
  118.       dir_name0=dir;  
  119.       if(dir_name0!="/")  
  120.       {  
  121.           dir_name0+="/";  
  122.       }  
  123.       dir_name0+=dir_name2;  
  124.       dir=dir_name0;  
  125.       dirlist<<dir;  
  126.       num++;  
  127.       qDebug("num-file=%d",num);  
  128.   }  
  129.   QDir picdir(dir);  
  130.   if(dir=="/")  
  131.   {  
  132.       picdir.setFilter(QDir::Dirs|QDir::NoDotAndDotDot);  
  133.   }  
  134.   else  
  135.   {  
  136.       picdir.setFilter(QDir::Dirs);  
  137.   }  
  138.   QFileInfoList list = picdir.entryInfoList();  
  139.   dir_list->clear();  
  140.   for(int i=0;i<list.size();i++)  
  141.   {  
  142.       QFileInfo fileInfo0 = list.at(i);  
  143.       QString path=fileInfo0.filePath();  
  144.       path.replace(dir, QString(""));  
  145.       path=path.remove(QChar('/'),Qt::CaseInsensitive);  
  146.       QListWidgetItem *item = new QListWidgetItem;  
  147.       item->setIcon(QIcon(":/folder.png"));  
  148.       item->setText(path);  
  149.       dir_list->insertItem((i+1),item);  
  150.   }  
  151. }  
  152. //OK键选择返回新图片文件夹路径  
  153. void FileDialog::chooseNewDir()  
  154. {  
  155.   qDebug("chooseNewDir()");  
  156.   qDebug()<<dir_name_lineE;  
  157.   emit newDir(dir_name_lineE);  
  158.   this->close();  
  159. }  
  160. //Cancle取消选择文件夹  
  161. void FileDialog::cancleChoose()  
  162. {  
  163.   qDebug("cancleChoose()");  
  164.   QString nullDir=NULL;  
  165.   qDebug()<<nullDir;  
  166.   emit newDir(nullDir);  
  167.   this->close();  
  168. }  


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PHP 遍历文件夹
QT中DBus的用法
qt 接口(转)
利用VBA实现批量打印的思路
判断文件夹存在
Qt如何进行MD5加密
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服