1.文檔目的
數(shù)碼相框程序在經(jīng)過qt-embedded交叉編譯之后,移植到開發(fā)板上發(fā)現(xiàn)當(dāng)打開open鍵選擇新圖片文件夾路徑時出現(xiàn)段錯誤。經(jīng)過查找資料后分析得出,qt類QFileDialog在非X-server環(huán)境下無法初始化,因?yàn)槠湓诔跏蓟瘯r需調(diào)用本地文件對話框。所以為了實(shí)現(xiàn)數(shù)碼相框可選擇新圖片文件夾路徑的功能,需要根據(jù)程序需要重寫QFileDialog。
2.實(shí)現(xiàn)過程
1) 文件對話框設(shè)計圖1如下:
圖1 文件對話框
2) 功能設(shè)計如下:
a. 當(dāng)數(shù)碼相框程序點(diǎn)擊open鍵之后,彈出文件對話框;
b. 通過文本框中顯示當(dāng)前選中文件夾路徑;
c. 通過點(diǎn)擊OK鍵實(shí)現(xiàn)將文本框中路徑設(shè)置為新圖片文件夾路徑;
d. 通過點(diǎn)擊Cancle鍵實(shí)現(xiàn)取消選擇功能;
e. 通過單擊文件夾列表中文件夾將焦點(diǎn)移植該文件夾,并在文本框中顯示改文件夾全路徑;
f. 通過雙擊文件夾列表中文件夾實(shí)現(xiàn)進(jìn)入該文件夾并更新文件夾列表信息;
g. 通過雙擊文件夾列表中的“·”文件夾選擇當(dāng)前目錄;
h. 通過雙擊文件夾列表中的“··”文件夾返回上一級。
3) 實(shí)現(xiàn)代碼:
- #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();
- }
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。