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());
}
相关推荐
wljy14 小时前
二、进制状态转换
linux·运维·服务器·c语言·c++
云泽8085 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
繁华落尽,倾城殇?5 小时前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
代码村新手5 小时前
C++-二叉搜索树
开发语言·c++
智者知已应修善业6 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业6 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
一然明月9 小时前
qt基本用法
开发语言·qt
玖釉-10 小时前
二叉树展开为链表:从先序遍历到原地指针重排
c++·windows·算法·leetcode·链表
Mister西泽11 小时前
C++ Primer Plus 第六版 编程练习题及详细答案
开发语言·c++·学习·visual studio
Qt程序员11 小时前
从上电到系统就绪:ARM+U-Boot 嵌入式 Linux 启动流程
linux·运维·c++·内核·设备树·嵌入式·ram