Qt SD卡 文件系统挂载、文件预览

/***********************************************************************************                         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);}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 文件压缩、解压及下载

C#打包文件夹成zip格式&#xff08;包括文件夹和子文件夹下的所有文件&#xff09; C# 文件压缩与解压(ZIP格式) asp.net实现文件夹及文件压缩&#xff0c;并实现下载转载于:https://www.cnblogs.com/myparamita/archive/2012/06/04/2534206.html

Servlet生命周期和方法

一、五个生命周期方法&#xff0c;有三个很重要&#xff0c;初始化方法、提供服务方法和销毁方法 1、三个主要方法 2、另外两个重写的成员方法只做了解 二、生命周期详解 其中&#xff0c;每次刷新页面都是一次对servlet访问&#xff1b; 页面访问&#xff0c;根据域名找到主机…

如何查看端口被占用

最近在做有关WCF的系统&#xff0c;可能是在方法回调的过程中会默认通过TCP&#xff1a;80端口&#xff0c;报错为80端口被占用&#xff0c;然而我又不知道什么程序占用了80端口&#xff0c;上网一找&#xff0c;没想真不少人碰到我一样的问题&#xff0c;嘿嘿。 run "net…

centos7 搭建Docker Registry

registry2.x版本比1版本的速度快而且加了认证环境规划&#xff1a;192.168.0.167Registry192.168.0.168client192.168.0.1671.安装并启动docker#添加yum源 [rootRegistry ~]# sudo tee /etc/yum.repos.d/docker.repo <<-EOF [dockerrepo] nameDocker Repository baseurl …

Servlet3.0注解配置访问路径和urlParttern配置

一、Servlet用注解配置访问路径 二、IDEA的tomcat相关配置 其中&#xff0c;第一点的配置文件&#xff0c;直接在IDEA的可视化操作界面修改就可以改掉配置文件中内容&#xff1b; 三、urlParttern配置 其中&#xff0c;* 时通配符&#xff0c;优先级最低&#xff1b; 转载于:ht…

现货黄金入门知识普及一:图形分析之K线理论

&#xff2b;线又称阴阳线、棒线、红黑线或蜡烛线&#xff0c;最早起源于日本德川幕府时代的米市交易&#xff0c;经过二百多年的演进&#xff0c;现已广泛应用于证券市场的技术分析中&#xff0c;成为技术分析中的最基本的方法之一&#xff0c;从而形成了现在具有完整形式和分…

phpweb2.0 开发实战 ----- 配置虚拟主机

配置虚拟主机apache&#xff1a;同一个IP不同的主机一、加载&#xff1a;LoadModule rewrite_module modules/mod_rewrite.so&#xff0c; 去掉前面的#号。启动重写模块二、修改文件&#xff1a;应用目录下的httpd.conf文件内容如下&#xff1a;<VirtualHost 127.0.0.1>S…

openssl工具的使用以及创建私有CA

openssl软件包在安装之后&#xff0c;主要会生成三段重要内容&#xff1a;加密库ssl相关库文件openssl命令行工具下面就来介绍一下openssl命令行工具的使用&#xff1a;openssl和yum类似&#xff0c;有着许许多多的子命令&#xff1a;如果要获得这些子命令的相关man文档&#x…

Servlet体系结构

一、使用HttpServlet 其中&#xff0c;HttpServlet在重写的service()方法中对http请求的共7中提交方式进行了判断&#xff0c;所以只要我们只要重写对应的请求方式处理逻辑方法 doGet()和doPost()方法就可以&#xff1b; 浏览器直接访问servelet是get请求&#xff0c;参数列表会…

(转)剖析Delphi中的构造和析构

剖析Delphi中的构造和析构 1 Delphi中的对象模型: 2 1.1 对象名表示什么&#xff1f; 2 1.2 对象存储在哪里&#xff1f; 2 1.3 对象中存储了什么&#xff1f;它们是如何存储的? 3 2 构造函数与创建对象 5 2.1 什么是构造函数&#xff1f;(“特殊的”类方法) 5 2.2 对象的创建…

(NO.00001)iOS游戏SpeedBoy Lite成形记(八)

前一篇提到,如果要想动态修改选手的速度需要在update方法中添加代码. 因为update方法在游戏每一帧都会调用,所以我们不可能修改的太频繁.否则一来对性能有影响,而来玩家表现的极不自然,像抽风一样. 所以我决定,在一场比赛中每位选手的速度最多只能修改5次,先在GameScene中添加如…

【Linux】 命令收集

目录命令 转到home: cd ~ 转到目录的上层&#xff1a; cd ../ 转到目录的上上层&#xff1a; cd ../.. 返回进入当前目录前所在目录&#xff1a; cd - 复制文件&#xff08;将文件file复制到目录a下&#xff09;&#xff1a; cp file/ a 复制 软件安装 -删除 删除软件&#…

架构师之路(1)---面向过程和面向对象

1、引言 机算机科学是一门应用科学&#xff0c;它的知识体系是典型的倒三角结构&#xff0c;所用的基础知识并不多&#xff0c;只是随着应用领域和方向的不同&#xff0c;产生了很多的分支&#xff0c;所以说编程并不是一件很困难的事情&#xff0c;一个高中生经过特定的训练…

Servlet与缓存

Servlet类请求缓存&#xff1a;response.setDateHeader("Expires",System.currentTimeMills()1000*60*60) ;刷新缓存&#xff1a;请求头 If-Modified-Since服务器 lastModified请求头 和 服务器 进行比较 决定是否缓存转载于:https://www.cnblogs.com/Knuth/archive/…

HTTP快速入门

一、tomcat端口号设置为80&#xff0c;访问时候可以不加&#xff1b;http协议1.1版本可以复用连接&#xff0c;请求结束后会稍微等会&#xff1b; 二、 表单&#xff0c;get方式提交&#xff1a; 三、user-agent告诉服务器是哪个浏览器&#xff0c;代码中解决兼容性问题&#x…

vs2008生成自定义dll,VS2008发布、生成网站时设置固定的dll文件名

在用VS2008发布网站项目时,默认生成bin目录下的.dll文件名是随机命名的; 如果要固定生成文件名如何固定呢&#xff1f; 有以下两种方案&#xff1a; 一、每个页面的程序集分别生成对应的dll; 方法&#xff1a;在“发布网站”的选项中&#xff0c;勾选“使用固定命名和单页程…

oracleI基础入门(8)--table--MINUS

MINUSMINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果&#xff0c;然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话&#xff0c;那这一笔资料就被去除&#xff0c;而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于…

分类(二):基于向量空间模型的文本分类

2019独角兽企业重金招聘Python工程师标准>>> 利用向量空间模型进行文本分类的思路主要基于邻近假设&#xff08;contiguity hypothesis&#xff09;。 邻近假设&#xff1a; 同一类的文档会构成一个邻近区域&#xff0c;而不同类的邻近区域之间是互不重叠的。 1、Ro…

Request请求对象

一、Request对象由服务器创建&#xff0c;我们使用 浏览器访问服务器资源原理&#xff1a; 二、Request体系结构 其中&#xff0c;servlet 的service()方法参数列表是 servletRequest对象&#xff0c; HttpServlet 的 doGet()和 doPost() 方法参数列表是用的 HttpServletReques…