</pre><p></p><p>经过一个月的努力,除了界面还有待改进,交互方式略显单调,项目需求的基本功能已全部实现;部分高级功能也有了初步的想法和实践。</p><p> </p><p><strong><span style="font-size:18px;">基本功能的实现:</span></strong></p><p><span style="font-size:18px;">1.悬浮窗口的实现。</span></p><p>1.1<span style="font-family:宋体;">继承</span><span style="font-family:Times New Roman;">QWidget</span><span style="font-family:宋体;">类,设置</span><span style="font-family:Times New Roman;">Qt::FramelessWindowHint</span><span style="font-family:宋体;">属性去除边框,同时利用</span><span style="font-family:Times New Roman;">QPixmap</span><span style="font-family:宋体;">加载悬浮窗口的图片。</span></p><p>1.2<span style="font-family:宋体;">重写鼠标事件,包括移动、点击、拖动、双击等,以达到可鼠标拖动、双击打开主窗口、移动提示等功能。</span></p><p><pre name="code" class="cpp">
void MinIconWidget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_CurrentPos = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}
void MinIconWidget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() && Qt::LeftButton)
{
move(event->globalPos() - m_CurrentPos);
event->accept();
}
}
void MinIconWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(10, 10, 128, 128,m_Pixmap);
}
void MinIconWidget::leaveEvent(QEvent *event)
{
setCursor(Qt::ArrowCursor);
//exitButton->hide();
}
void MinIconWidget::enterEvent(QEvent *event)
{
setCursor(Qt::PointingHandCursor);
//exitButton->show();
}
void MinIconWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
emit DoubleClickedSignal();
}
2.主窗口的实现。
继承QWidget, 添加布局及其他item,方便交互。主界面上方为QGradLayout布局,可对u盘的信息进行检测并显示;下方为u盘热拔插管理及detail显示部分。
3.u盘热拔插的监听。
学习https://github.com/wang-bin/qdevicewatcher所采用的监听方式,并利用修改其部分代码。主要采用netlink和socket方式对bus上的信息进行过滤,同时获得u盘所对应的设备文件。
enum udev_monitor_netlink_group {
UDEV_MONITOR_NONE,
UDEV_MONITOR_KERNEL,
UDEV_MONITOR_UDEV
};
4.u盘信息获取及显示方式。
4.1当检测到u盘时,主要采用执行shell command的方式对u盘的信息进行获取。利用QProcess的特性,start()执行命令,readAll ()读取结果,并对结果(QString)进行解析。
QString HotplugWatcher_GUI::executeCMD(const QString &command, const QStringList &list)
{
qDebug("tid=%#x: execute command %s", (unsigned int) QThread::currentThreadId(), qPrintable(uDiskInfo->devicePath));
QString result = "";
process->start(command, list);
if(!process->waitForStarted())
{
qDebug() << "start failed!";
return 0;
}
process->closeWriteChannel();
while(false == process->waitForFinished());
result += process->readAll();
return result;
}
4.2 u盘挂载路径(mount path)、u盘空间信息、的获取。利用df -h devicepath得到磁盘信息,对返回结果进行处理筛选。
4.2 u盘厂商信息的获取。检测到u盘插入后,在/proc/scsi/usb-storage/下将自动生成u盘所对应的文件,QFile打开文件(ReadOnly),读取后找到vendor所对应的内容即生产厂商。
4.3 u盘文件类型和权限的获取。利用mount并过滤出u盘所对应的信息,其中包括u盘文件系统类型、权限信息及其他一些相关信息。
4.4 u盘IO速度的检测。包括初步的检测和深度的检测。初步的检测利用time dd 读写/dev/zero等文件,分析计算速度。利用hdparm -Tt对u盘速度进行深度测试,增加对cache读写速度的测试。(需要root权限)
对于软件需求的高级功能,经过和导师的交流,u盘修复和格式化已经有了大体的思路,但杀毒和检测u盘是否被篡改的解决方案还没有定下来。