vs2008 新建项目sloem1
sloem1form.h
cpp
#include "ui_sloem1form.h" //vom UIC erzeugte Header-Datei
#include "slgfwdialogform.h"
#include <QtGui/QFileSystemModel> // QFileSystemModel
#include "QtCore/QTimer.h" // QTimer.h
#include <windows.h> // UINT
#include <QtGui/QStringListModel> 用于显示磁盘列表
private:
QString gInitialPath;
QFileSystemModel *modelList;
QStringListModel *stringListModel; // 用于在列表视图中显示磁盘列表
void setupUsbTimer(); // 声明设置USB定时器的函数
void refreshAllDrivesDisplay(const QStringList& drives); // 新增:刷新所有磁盘显示
void showDriveContents(const QString& drivePath); // 新增:显示指定磁盘的内容
void showDriveList(); // 新增:显示磁盘列表
bool isDriveReady(const QString& drivePath); // 新增:检查磁盘是否就绪
QStringList getFileFilters(); // 新增:获取文件过滤器
QTimer *m_usbCheckTimer; // 声明定时器指针,用于定期检查U盘
QStringList m_lastDrives; // 修改:保存上一次检测到的磁盘列表(从 QString 改为 QStringList)
QString m_lastUsbPath; // 声明字符串变量,保存上一次记录的U盘路径
bool m_usbIsPresent; // 声明布尔变量,标记U盘当前是否在位(true=有,false=无)
void initFileListShow();
virtual void attachedToScreen(const QString& rszScreenName);
QStringList getAllAvailableDrives(void); // 获取所有可用磁盘(包括C盘和U盘)
// 显示模式枚举
enum DisplayMode
{
ModeDriveList, // 显示磁盘列表模式
ModeFileList // 显示文件列表模式
};
DisplayMode m_currentDisplayMode; // 当前显示模式
QString m_currentDrivePath; // 当前正在浏览的磁盘路径
private slots: // 私有槽函数区域,这些函数可以响应信号
void checkUsbStatus(); // 声明检查U盘状态的槽函数
void refreshUsbDisplay(); // 声明刷新USB显示内容的槽函数
void clearUsbDisplay(); // 声明清空USB显示内容的槽函数
//void onListViewClicked(const QModelIndex& index); // 新增:处理列表项点击事件
sloem1form.cpp
cpp
sloem1form::sloem1form(QWidget* pParent, const QString& rszName)
: SlGfwDialogForm(pParent, rszName)
{
setupUi(this);
gInitialPath = "";
//modelList = new QFileSystemModel(this);
} // <-- sloem1form::sloem1form ()
void sloem1form::attachedToScreen(const QString& rszScreenName)
{
this->initFileListShow();
// need to call the base class
SlGfwDialogForm::attachedToScreen(rszScreenName);
}
void sloem1form::initFileListShow()
{
// 清空列表视图
if (this->listView)
{
this->listView->setModel(NULL);
}
// 清理旧的模型数据
if (modelList)
{
delete modelList;
modelList = NULL;
}
// 重新创建模型用于显示本地文件
modelList = new QFileSystemModel(this);
QStringList filter;
filter << QString("*.$$9");
QString usbDrive = gInitialPath;
modelList->setRootPath( usbDrive);
modelList->setReadOnly(true);
modelList->setNameFilters(filter);
modelList->setNameFilterDisables(false);
this->listView->setModel( modelList);
this->listView->setRootIndex(modelList->index( usbDrive));
// 设置U盘检测
setupUsbTimer(); // 调用设置定时器的函数,启动U盘检测功能
}
void sloem1form::setupUsbTimer() // 定义设置USB定时器的函数
{
m_lastUsbPath = ""; // 将上次记录的U盘路径设置为空字符串
m_usbIsPresent = false; // 将U盘在位标志设置为假(表示当前没有U盘)
m_usbCheckTimer = new QTimer(this); // 创建新的定时器对象,父对象是当前窗口
connect(m_usbCheckTimer, SIGNAL(timeout()), this, SLOT(checkUsbStatus())); // 连接定时器的超时信号到检查函数
m_usbCheckTimer->start(1000); // 启动定时器,设置间隔为1000毫秒(1秒)
// 立即执行一次检查
checkUsbStatus(); // 调用检查函数,立即检测一次U盘状态,不需要等1秒
}
// 返回所有磁盘(保持 QStringList)
QStringList sloem1form::getAllAvailableDrives()
{
QStringList drives;
for (char drive = 'A'; drive <= 'Z'; drive++)
{
QString rootPath = QString("%1:/").arg(drive); // 例如C:/
UINT type = GetDriveTypeW((LPCWSTR)rootPath.utf16());
// 显示固定磁盘和可移动磁盘
if (type == DRIVE_FIXED || type == DRIVE_REMOVABLE)//type == DRIVE_CDROM)光驱
{
drives << rootPath;
}
}
return drives;
}
// 不再简单判断有/无,而是对比列表变化
void sloem1form::checkUsbStatus()
{
QStringList currentDrives = getAllAvailableDrives();
// 检查是否有变化(简化版:直接刷新)
static QStringList lastDrives;
if (currentDrives != lastDrives)
{
refreshAllDrivesDisplay(currentDrives);
lastDrives = currentDrives;
}
}
// 新增:刷新所有磁盘显示
void sloem1form::refreshAllDrivesDisplay(const QStringList& drives)
{
// 清空列表视图
if (this->listView)
{
this->listView->setModel(NULL);
}
// 清理旧的模型数据
if (modelList)
{
delete modelList;
modelList = NULL;
}
modelList = new QFileSystemModel(this);
// 如果有多个磁盘,需要特殊处理
if (drives.isEmpty())
{
// 没有磁盘时显示空
return;
}
else if (drives.size() == 1)
{
// 只有一个磁盘时,直接显示其内容
QStringList filter;
filter << QString("*.$$$");
modelList->setRootPath(drives[0]);
modelList->setReadOnly(true);
modelList->setNameFilters(filter);
modelList->setNameFilterDisables(false);
this->listView->setModel(modelList);
this->listView->setRootIndex(modelList->index(drives[0]));
}
else
{
// 多个磁盘时,显示磁盘列表(而不是文件内容)
// 需要在 listView 中显示磁盘列表,点击后再显示文件
// 这部分需要根据你的实际需求实现
QStringListModel* stringModel = new QStringListModel(this);
stringModel->setStringList(drives);
this->listView->setModel(stringModel);
}
}
// refreshUsbDisplay
void sloem1form::refreshUsbDisplay()
{
refreshAllDrivesDisplay(getAllAvailableDrives());
}
// clearUsbDisplay
void sloem1form::clearUsbDisplay()
{
refreshAllDrivesDisplay(getAllAvailableDrives());
}