• 45459阅读
  • 38回复

[已解决][难题]Linux下如何用QT检测到U盘已经插入,并实现mount与umount [复制链接]

上一主题 下一主题
离线blueliang
 
只看楼主 倒序阅读 楼主  发表于: 2008-12-11
— 本帖被 XChinux 设置为精华(2011-06-22) —
因为开发一个自动插入U盘就自动复制,并且要能在复制开始前先对U盘进行格式化。
想让Linux先对U盘进行格式化,然后再对U盘进行加载,加载完成后开始复制,复制完成后自动卸载。
现在Linux好像都可以自动加载。但不知道用QT的话应该怎么样编写。

先谢谢大家了

已经找到解决方法,下面只描述最主要的部分,其他部分不是难题,问题主要在于怎么样发现U盘的插入与拨出,使用qt自带的QDBus可以实现,下面为连接代码,当系统有设备插入时,可以调用slotDeviceAdded(QString udi)函数。


在pro文件中应该加入
QT +=dbus

  1. #include <QtDBus/QDBusConnection>
  2. //以下为检测设备的插入
  3.       QDBusConnection::systemBus().connect(    "org.freedesktop.Hal",
  4.                         "/org/freedesktop/Hal/Manager",
  5.                         "org.freedesktop.Hal.Manager",
  6.                         "DeviceAdded",
  7.                         this,
  8.                         SLOT(slotDeviceAdded(QString )));
  9. //以下为检查设备的拨出
  10.     QDBusConnection::systemBus().connect(    "org.freedesktop.Hal",
  11.                         "/org/freedesktop/Hal/Manager",
  12.                         "org.freedesktop.Hal.Manager",
  13.                         "DeviceRemoved",
  14.                         this,
  15.                         SLOT(slotDeviceRemoved(QString )));

在slotDeviceAdded(QString udi)函数中,要使用到

  1.     QDBusInterface device("org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device" , QDBusConnection::systemBus());

通过HAL可以查询到设备为volume的设备,然后通过判断是否为/dev/sd*的设备,就可以判断出是否为U盘,然后调用mount就可以了。
这时记录下U盘的UDI,在检测到设备拨出时,再查询一下U盘的UDI是否还在,就知道U盘是否被拨出了。
[ 此贴被blueliang在2008-12-24 10:04重新编辑 ]
描述:HAL的详细介绍HAL 0.5.10 Specification
附件: hal-spec.html.tar.gz (47 K) 下载次数:636
1条评分金钱+10
abcde1224 金钱 +10 - 2022-03-24
离线rockyluo

只看该作者 1楼 发表于: 2008-12-12
Linux能自动加载么???  敢问lz用的什么内核?  自己编的?
Qt仅仅显示而已,不要把它想的太强大........
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线wvins
只看该作者 2楼 发表于: 2008-12-12
用 Ubuntu吧
插上去就自动mount
离线blueliang
只看该作者 3楼 发表于: 2008-12-12
mount上去了,就不能格式化了呀!
离线blueliang
只看该作者 4楼 发表于: 2008-12-12
要实现:在程序中格式化后,再mount上去
离线tangooricha

只看该作者 5楼 发表于: 2008-12-12
HAL
离线mileden

只看该作者 6楼 发表于: 2008-12-13
这个跟linux内核有关系,当插上U盘时,系统就有响应,关键是怎么把这个事件通知给Qt应用程序。
离线water_wf

只看该作者 7楼 发表于: 2008-12-13
这个如果完全用qt做,还有点问题要解决,lz如果做好了,分享一下,或者聊聊qq:29205426
离线blueliang
只看该作者 8楼 发表于: 2008-12-14
现在只知道要用udev,然后在U盘插入时让udev传递一个信息出来。但不知道怎么样用QT接收这个消息
离线duduqq

只看该作者 9楼 发表于: 2008-12-14
这确实是一个难道!!!!
帮顶
离线mumutouv

只看该作者 10楼 发表于: 2008-12-15
我建议你一个方法,开启一个qtimer,然后在timeout里面检测/proc/partititon文件,以及/proc/mount文件,我写过很多这方面的软件,当然从hal层来做的话,也可以,但是你必须首先连接dbus
离线blueliang
只看该作者 11楼 发表于: 2008-12-15
引用第10楼mumutouv于2008-12-15 08:45发表的  :
我建议你一个方法,开启一个qtimer,然后在timeout里面检测/proc/partititon文件,以及/proc/mount文件,我写过很多这方面的软件,当然从hal层来做的话,也可以,但是你必须首先连接dbus


这几天查了一些相关的资料,现在我主要是想通过建立dbus连接来获取HAL信息来实现。如果有什么进展的话,再向大家汇报。
离线evoleci
只看该作者 12楼 发表于: 2008-12-15
感觉以后肯定会用到,关注中。。。
我们只是在经历着一些事情。
离线blueliang
只看该作者 13楼 发表于: 2008-12-23
已解决,方法放到顶楼了
离线wd007

只看该作者 14楼 发表于: 2008-12-23
好帖,学习了
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线wangbenqq

只看该作者 15楼 发表于: 2008-12-24
我使用了,怎么提示错误: QDBusConnection:No such file or directory
为什么呢?
离线blueliang
只看该作者 16楼 发表于: 2008-12-24
引用第15楼wangbenqq于2008-12-24 09:17发表的  :
我使用了,怎么提示错误: QDBusConnection:No such file or directory
为什么呢?


#include <QtDBus/QDBusConnection>

在pro文件中还应该加入
QT +=dbus
离线wangbenqq

只看该作者 17楼 发表于: 2008-12-24
对于slotDeviceAdded(QString )
里面必须要QDBusInterface device("org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device" , QDBusConnection::systemBus());么??

我的思路是直接扫描/dev下有没有sd*就可以了啊

你说呢???

但是我同时拔除U盘的时候,程序就挂了
离线blueliang
只看该作者 18楼 发表于: 2008-12-24
其实我的设计思路是在SD读卡器上插拨SD卡,
离线blueliang
只看该作者 19楼 发表于: 2008-12-24
引用第17楼wangbenqq于2008-12-24 11:24发表的  :
对于slotDeviceAdded(QString )
里面必须要QDBusInterface device("org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device" , QDBusConnection::systemBus());么??
我的思路是直接扫描/dev下有没有sd*就可以了啊
.......

其实/dev/sda并不一定是你要加载的分区,有时会是/dev/sda1,所以,如果是通过扫描的话,还是要判断这个是不是volume;

你说的同时拨除U盘的时候程序就挂了,是什么情况?
[ 此贴被blueliang在2008-12-24 15:06重新编辑 ]
离线wangbenqq

只看该作者 20楼 发表于: 2008-12-24
我调试时候,但不跟了一下

我发现,我的槽:比如:remove()
一直在运行,是为什么呢?
这个槽怎么一直在运行呢?
离线wangbenqq

只看该作者 21楼 发表于: 2008-12-24
我的程序在插拔几次之后
界面就没反映了

不知道是为什么
离线wangbenqq

只看该作者 22楼 发表于: 2008-12-24
您的槽是怎么写的呢??
离线blueliang
只看该作者 23楼 发表于: 2008-12-24
一般你插入一个U盘,实际上你的系统会添加一些设备,我这边的话是6个,所以你的槽函数实际上会运行6次。
离线420291269

只看该作者 24楼 发表于: 2009-02-20
能说详细些么?
离线noodlesoup
只看该作者 25楼 发表于: 2009-05-20
我已经照着你的方法做,可是QT还是没有收到LINUX给的插入讯息。
可以给我更详细的code吗?
离线loveuever
只看该作者 26楼 发表于: 2010-01-11
引用第23楼blueliang于2008-12-24 17:33发表的  :
一般你插入一个U盘,实际上你的系统会添加一些设备,我这边的话是6个,所以你的槽函数实际上会运行6次。


怎么能让 槽函数 只执行一次?
离线xiaoniu55888
只看该作者 27楼 发表于: 2010-06-12
楼主能不能分享一下代码啊,我正找这个用Qt编写的U盘检测程序呢!加我好友吧!谢谢!QQ:563920459
离线zzxap

只看该作者 28楼 发表于: 2011-05-18
rror: variable ‘QDBusInterface device’ has initializer but incomplete type
离线brucewuu

只看该作者 29楼 发表于: 2011-06-22
哥们有源代码吗? qq 419789549 谢谢哦
离线brucewuu

只看该作者 30楼 发表于: 2011-06-23
能给我发下源代码吗? qq419789549
离线leifenger
只看该作者 31楼 发表于: 2011-08-29
引用第20楼wangbenqq于2008-12-24 15:12发表的  :
我调试时候,但不跟了一下
我发现,我的槽:比如:remove()
一直在运行,是为什么呢?
这个槽怎么一直在运行呢?


插入一个usb设备,其实系统要增加很多设备,我在ubuntu虚拟机里试验是7个设备,每个设备都是上一个设备的子设备,一直到最后一个才是真正的usb设备。remove也一样。
离线leifenger
只看该作者 32楼 发表于: 2011-08-29
具体实现思路和代码在这里。欢迎和大家讨论。

代码实现
离线t2397362
只看该作者 33楼 发表于: 2011-10-08
菜鸟关注学习中
离线yanzi1225627
只看该作者 34楼 发表于: 2012-08-10
离线yanzi1225627
只看该作者 35楼 发表于: 2012-08-16
这个具体我已经实现了,在pc上 和在arm上是不同的。等我回头写个博客 。。。
离线smaller

只看该作者 36楼 发表于: 2015-04-30
正需要,学习一下,谢谢咯

只看该作者 37楼 发表于: 2019-01-17
回 zzxap 的帖子
zzxap:rror: variable ‘QDBusInterface device’ has initializer but incomplete type (2011-05-18 12:37) 

前辈,我也遇到这个问题了

只看该作者 38楼 发表于: 2019-01-17
回 真的好多巧合 的帖子
真的好多巧合:前辈,我也遇到这个问题了[表情] (2019-01-17 15:51) 

已解决

加入这个头文件    #include <QDBusInterface>
快速回复
限100 字节
 
上一个 下一个