/***********************************************************************************                         Qt SD卡 文件系统挂载、文件预览* 声明:*     1. 验证挂载SD卡;*     2. QTreeView显示文件系统文件;*     3. UI线程、普通线程通信,以及理解其工作分配;*     4. static const的使用;*     5. QString与const char *的转换;**                                           2015-10-20 晴 深圳 南山平山村 曾剑锋*********************************************************************************/\\\\\\\\\\-*- 目录 -*-//|    一、cat main.cpp|    二、cat mountthread.h|    三、cat mountthread.cpp|    四、cat mainwidow.h|    五、cat mainwindow.cpp--------------------------------
一、cat main.cpp#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);/*** 1. 创建窗口* 2. 设置标题* 3. 设置无最大最小化按钮* 4. 显示窗口*/MainWindow w;w.setWindowTitle("fileSystem");w.setWindowFlags(w.windowFlags()& ~Qt::WindowMaximizeButtonHint& ~Qt::WindowMinimizeButtonHint);w.show();return a.exec();}二、cat mountthread.h#ifndef MOUNTTHREAD_H#define MOUNTTHREAD_H#include <QThread>#include <QString>#include <QMessageBox>#include <QFileInfo>/*** @brief The MountThread class* 挂载文件系统线程,需要创建这个线程的原因如下:*     1. 当mountSD按钮被按下的时候,需要使按钮处于无效状态;*     2. 当SD卡文件系统挂载完毕时,按钮要处于有效状态;*     3. 这么做主要是防止一些误操作,或者也可当作为一种状态提示;*     4. 基于以上原因,就出现了preMount()、postMount()这两个信号;*     5. preMount()在处理mount之前发出的信号,UI线程可以更新按钮到无效状态;*     6. postMout()在处理mount之后发出的信号,UI先生可以更新按钮到有效状态;** 其实之所以要这么做,是因为如果这些在UI线程中做,一般在一个函数里完成,UI线程采用* 从上到下的程序执行流程,无法更新UI控件的状态,所以目前只能采用这种方式来做。*/class MountThread : public QThread{Q_OBJECTpublic:/*** @param exsdNode         扩展sd卡生成的设备节点* @param mountNode        要将sd卡挂载到那个文件系统节点上* @param parent*/explicit MountThread(QString exsdNode, QString mountNode, QObject *parent = 0);/*** 信号通过传参的方式,后续由UI线程dealWithUi()槽统一处;*/static const int PRE_MOUNT       = 1;static const int POST_MOUNT      = 2;static const int DEVICE_UNEXIST  = 3;/*** @brief SLEEP_DELAY_MS* 设置mount后等待的时间,这里其实可以不需要,但是本人还是设置了,没有原因   :)*/static const int SLEEP_DELAY_MS = 1000;signals:void preMount(int mesg);void postMount(int mesg);void deviceUnExist(int mesg);private:/*** 重写run方法*/void run();private:/*** 扩展sd卡生成的设备节点*/QString exsdNode;/*** 要将sd卡挂载到那个文件系统节点上*/QString mountNode;};#endif // MOUNTTHREAD_H三、cat mountthread.cpp#include "mountthread.h"MountThread::MountThread(QString exsdNode, QString mountNode, QObject *parent) :QThread(parent){/* 获取sd卡设备节点,mount需要挂载到的文件系统节点 */this->exsdNode = exsdNode;this->mountNode = mountNode;}void MountThread::run(){/* 发送开始mount信号 */emit preMount( PRE_MOUNT );QFileInfo fileInfo( exsdNode );if( fileInfo.exists() ) {/*** 1. 先卸载一下,保证当前次挂载* 2. 重新挂载在目标文件节点上* 3. 等待一下,这里貌似可以不等待的,没有理由  :)*/system( QString( "umount " ).append( exsdNode ).toLocal8Bit() );system( QString( "mount " ).append( exsdNode ).append( " " ).append( mountNode ).toLocal8Bit() );msleep( SLEEP_DELAY_MS );} else {/* 设备节点不存在,弹出提示框 *//* 2015-11-12 modify : move this to UI thread// QMessageBox::warning(NULL, "WARNING", "Please check your SD card has plugin slot.");emit deviceUnExist(DEVICE_UNEXIST);}/* 发送结束mount信号 */emit postMount( POST_MOUNT );}四、cat mainwidow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QFileSystemModel>#include <QThread>#include <mountthread.h>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();protected:void moveEvent(QMoveEvent *);void resizeEvent(QResizeEvent *);void closeEvent(QCloseEvent *);private slots:void on_detectButton_clicked();void on_umountButton_clicked();/*** 处理MountThread线程发送过来的preMount()和postMount()信号*/void dealwithUi(int mesg);private:QFileSystemModel model;Ui::MainWindow *ui;MountThread *mountThread;    // 挂载线程
    };#endif // MAINWINDOW_H五、cat mainwindow.cpp#include "mainwindow.h"#include "ui_mainwindow.h"#include <sys/ioctl.h>#include <unistd.h>#include <fcntl.h>#include <QFileInfo>#include <QMessageBox>#include <QTreeView>#include <QDebug>/* sd卡生成的设备节点 */#define EXSD_NODE             "/dev/mmcblk1p1"/* sd卡挂载的文件系统节点 */#define MOUNT_NODE            "/mnt/exsd"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);/*** 这里主要是设置treeview的一些参数*/ui->showDir->setModel( &model );model.setRootPath( MOUNT_NODE );ui->showDir->setRootIndex( model.index( MOUNT_NODE ) );// Demonstrating look and feel featuresui->showDir->setAnimated( false );ui->showDir->setIndentation( 20 );ui->showDir->setSortingEnabled( true );ui->showDir->setColumnWidth( 0, 250 );/*** 1. 创先mount线程;* 2. 绑定信号与槽。*/mountThread = new MountThread( EXSD_NODE, MOUNT_NODE );connect( mountThread, SIGNAL(preMount(int)), this, SLOT(dealwithUi(int)) );connect( mountThread, SIGNAL(postMount(int)), this, SLOT(dealwithUi(int)) );}void MainWindow::dealwithUi(int mesg){if( MountThread::PRE_MOUNT == mesg ) {/* 将button设置为无效效果 */ui->detectButton->setEnabled( false );ui->umountButton->setEnabled( false );qDebug() << "premount." << endl;} else if ( MountThread::POST_MOUNT == mesg ) {/*** 1. 这里一定需要:*        model.setRootPath( "/mnt" );*     model.setRootPath( MOUNT_NODE );* 2. /mnt不是固定的,随便什么值都行,这里主要是为了触发rootPath改变了,在设置回来,*        要不然,treeview不会显示。*/model.setRootPath( "/mnt" );model.setRootPath( MOUNT_NODE );ui->showDir->setRootIndex( model.index( MOUNT_NODE ) );/* 恢复按钮有效效果 */ui->detectButton->setEnabled( true );ui->umountButton->setEnabled( true );qDebug() << "postmount." << endl;/* 2015-11-12 add this for in UI thread */} else if ( MountThread::DEVICE_UNEXIST == mesg ) {QMessageBox::warning(NULL, "WARNING", "Please check your SD card has plugin slot.");}}void MainWindow::on_detectButton_clicked(){/*** 1. 开启线程,看似无关紧要的,只有短短一行,却包暗含着UI线程与普通线程的区别;* 2. UI线程维护UI界面的更新;* 3. UI界面不宜做时间很长、耗费资源的事;* 4. 普通线程通过发送信号与UI线程进行沟通,处理UI显示更新。*/mountThread->start();}void MainWindow::on_umountButton_clicked(){/* 卸载sd卡 */system( QString( "umount " ).append( EXSD_NODE ).toLocal8Bit() );}MainWindow::~MainWindow(){delete ui;}void MainWindow::moveEvent(QMoveEvent *){this->move( QPoint( 0, 0 ) );}void MainWindow::resizeEvent(QResizeEvent *){this->showMaximized();}void MainWindow::closeEvent(QCloseEvent *){exit(0);}

Qt SD卡 文件系统挂载、文件预览相关推荐

  1. Android实现PDF格式文件预览

    前言: 接着上一篇的博客,在搜索出手机内的.pdf格式文件后,实现pdf文件的预览的方式有很多, 1.Android PdfViewer项目地址: https://github.com/barteks ...

  2. ftp服务器文件能预览吗,ftp服务器 文件预览

    ftp服务器 文件预览 内容精选 换一换 将文件上传至Linux服务器一般会采用WinSCP工具.本节为您介绍本地Windows计算机使用WinSCP工具,上传文件至Linux云服务器的操作方法.以下 ...

  3. sd卡中的文件夹删除了怎么恢复,SD卡删除的文件如何恢复

    据统计,现如今SD卡的使用频率非常高,为手机扩展内存.放在相机中保存照片等等,SD卡的内存也越来越大,而里面的数据储存量也多了起来,那么当SD卡中文件删除了怎么办呢?SD卡删除的文件如何恢复? 得力数 ...

  4. linux sd卡挂载脚本,Linux下实现U盘、SD卡自动挂载功能 .

    在 Linux中我们经常用到U盘.SD卡的挂载问题,每次都手动挂载或卸载非常麻烦,我们可以采取以下方法实现自动挂载或卸载U盘.SD卡 1.首先在/etc/init.d/rsC中加入以下语句 echo ...

  5. 修改mdev配置支持SD卡自动挂载

    我们启动开发板之后,将SD卡插上会打印如下信息: # s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz). s3c2440-sdi s ...

  6. iOS 版微信可以改微信号;传腾讯计划入股爱奇艺;Qt 6.0 发布首个预览版本| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...

  7. 文件查看器示例支持 文件预览,编辑和视频播放

    以下为文件查看器示例,支持 文件预览,和视频播放: import QtQuick 2.2 import QtQuick.Window 2.1 import QtQuick.Controls 1.2 i ...

  8. 文件预览——一路躺过来的那些坑

    因为最近项目比较紧,所以dubbo源码系列是顾不上了. 恰巧这周花了几天在做文件预览这块,两三天的时间下来,有过一些走弯路的经验教训(准确说,全都是弯路),在这里给大家分享下~ 背景 基于产品需求,需 ...

  9. 如何访问嵌入式设备sd卡上的文件

    sd卡上的文件属于硬件上真实的文件,想要访问必需先挂载. 1.检测系统有无自动挂载   命令:cat /proc/mounts 如果自动挂载成功会显示这样 /dev/mmcblk1p1 是sd卡位置, ...

最新文章

  1. RabbitMQ学习总结(7)——Spring整合RabbitMQ实例
  2. python绘制动态图-Python图像处理之gif动态图的解析与合成操作详解
  3. 自学python清单-python学习清单
  4. Eigen 模板库的简介
  5. python第一堂课
  6. SQL Server里的 ISNULL 与 Oracle 中的 NULLIF
  7. 技术沙龙直播 | 数据库技术探索及行业应用
  8. protobuf在java应用中通过反射动态创建对象
  9. 华三ospf联动bfd_HCIE2020__路由交换专家__BFD综合实验
  10. 《疯狂前端开发讲义jQuery+Angular+Bootstrap前端开发实践》学习笔记
  11. WordPress5.7版本下载及更新内容
  12. MySQL中查看某数据库大小及表大小
  13. android工控软件,基于Android的工业控制监控软件的设计和开发
  14. python小例子-Python 常用小例子
  15. ylbtech-Bill(发票管理)-数据库设计
  16. 傅里叶变换的终极解释下
  17. Leetcode(java)
  18. Python数据分析与机器学习项目实战
  19. 如何打开计算机共享文件,如何打开共享文件 局域网文件共享的图文方法
  20. c语言编程 甲乙丙丁谁是罪犯的题,犯罪大师第二届推理大赛有甲乙丙丁四人答案是什么...

热门文章

  1. 前端将二进制数据流转为文件_前端通过二进制流下载文件
  2. 优化器,SGD+Momentum;Adagrad;RMSProp;Adam
  3. FPFH+ICP点云配准
  4. Core Java Volume I — 3.6. Strings
  5. gedit搭建c开发环境
  6. Silverlight OOB Setup
  7. java继承上机作业
  8. centos7 安装python3
  9. GS使用HTTPS登录的设置过程
  10. Office 2016中Excel的部分快捷方式