u盘插入拔出,listView不显示盘符变化

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());
}
相关推荐
小熊Coding2 小时前
Windows 上安装 mysqlclient 时遇到了编译错误,核心原因是缺少 Microsoft Visual C++ 14.0 或更高版本 的编译环境。
c++·windows·python·microsoft·django·mysqlclient·bug记录
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(六):<线程同步与互斥>线程同步(上)
java·linux·运维·服务器·c++·学习·线程
feng_you_ying_li2 小时前
C++11可变模板参数,包扩展,emplace系列和push系列的区别
前端·c++·算法
tankeven2 小时前
HJ177 可匹配子段计数
c++·算法
白藏y2 小时前
【C++】ifstream、ofstream、fstream的基础使用
c++
皮卡蛋炒饭.2 小时前
Linux进程信号
开发语言·c++
共享家95272 小时前
C++ 日志类设计
linux·c++·后端
小辉同志2 小时前
208. 实现 Trie (前缀树)
开发语言·c++·leetcode·图论
John.Lewis3 小时前
C++加餐课-stack_queue:反向迭代器
数据结构·c++