QTableWidget实现鼠标滚动加载文件

第一步:先在头文件定义事件过滤器,使QTableWidget安装文件过滤器。

//主要要添加QScrollBar和QWheelEvent头文件
#include <QtWidgets/QScrollBar> 
#include <QtGui/QWheelEvent>


//事件过滤器
bool eventFilter(QObject *ojb, QEvent *event);

//根据滚轮滚动填充数据
void WheelFillData();

第二步:在QTableWidegt初始化时,安装事件过滤器

//qTableFile为QTableWidget成员变量
qTableFile->verticalScrollBar()->installEventFilter(this);

第三步:实现eventFilter 

//事件过滤器
bool FileViewWidget::eventFilter(QObject *obj, QEvent *event)
{
	if (obj == qTableFile->verticalScrollBar())
	{
		if (event->type() == QEvent::Wheel)
		{
			QWheelEvent *wheelEvent = static_cast<QWheelEvent *>(event);
            
            //鼠标向上滚动
            //if (wheelEvent->delta() > 0)
			//{
			//	
			//}
			
			//鼠标向下滚动
			if (wheelEvent->delta() < 0)
			{
				//填充数据
				WheelFillData();
			}

			//实现鼠标滚轮时原表格视点进行滑动
			int degress = wheelEvent->angleDelta().ry() * 0.01;
			if (wheelEvent->orientation() == Qt::Vertical)
				qTableFile->verticalScrollBar()->setValue(qTableFile->verticalScrollBar()->value() - degress);
			wheelEvent->accept();

			return true;
		}
		else
			return false;

	}
	else
		return FileViewWidget::eventFilter(obj, event);
}

第四步:根据需求填充表格

//根据滚轮滚动填充数据
void FileViewWidget::WheelFillData()
{
    //获取表格当前的行数
	m_CurIndex = qTableFile->rowCount() - 1;

	//如果加载完成直接返回,3为 索引 . ..
	if (m_CurIndex + 3 == m_TolIndex)
	{
		return;
	}

	//先关闭滚动事件 防止数据冲突
	qTableFile->verticalScrollBar()->removeEventFilter(this);

    //每次滚动移动填充10条数据
	int _end;
	if ((m_CurIndex + 10) > m_TolIndex - 2)
	{
		_end = m_TolIndex - 2;
	}
	else
	{
		_end = m_CurIndex + 10;
	}

	//设置行数
	qTableFile->setRowCount(_end);								
	for (int rows = m_CurIndex, i = m_CurIndex + 2; rows < _end; rows++, i++)
	{
		//QFileInfo tmpFileInfo = m_list.at(i);
		//使用指针保存QFileInfo地址
		QFileInfo * tmpFileInfo = new QFileInfo(m_list.at(i));
		for (int columns = 0; columns < 4; columns++)
		{
			if (columns == 0)								//第零列 显示文件名字
			{
				//根据文件夹对应系统图标
				QFileIconProvider iconprovider;
				QIcon icon = iconprovider.icon(*tmpFileInfo);
				//设置表格绑定值
				QTableWidgetItem * item = new QTableWidgetItem();
				QVariant var;
				var.setValue<void *>(tmpFileInfo);
				item->setData(Qt::UserRole, var);

				//在item上绑定图标和文件名
				item->setIcon(icon);
				item->setText(tmpFileInfo->fileName());

				//为表格添加数据 设置文字居中
				qTableFile->setItem(rows, columns, item/*new QTableWidgetItem(icon, tmpFileInfo.fileName())*/);
				//qTableFile->item(rows, columns)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
			}
			else if (columns == 1)							//第一列 显示文件大小
			{
				if (tmpFileInfo->isDir())					//如果是文件夹 则不显示文件大小
				{
					qTableFile->setItem(rows, columns, new QTableWidgetItem());
				}
				else										//非文件夹显示文件大小
				{
					qTableFile->setItem(rows, columns, new QTableWidgetItem(bin_Conversion(tmpFileInfo->size())));
				}
				//设置文字居中
				//qTableFile->item(rows, columns)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
			}
			else if (columns == 2)							//第二列 显示文件格式
			{

				if (tmpFileInfo->isDir())					//如果是文件夹 则显示File Folder
				{
					qTableFile->setItem(rows, columns, new QTableWidgetItem(QString::fromLocal8Bit("File Folder")));
				}
				else
				{
					QString suffix = tmpFileInfo->suffix() + " File";
					qTableFile->setItem(rows, columns, new QTableWidgetItem(suffix));
				}
				//设置文字居中
				//qTableFile->item(rows, columns)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
			}
			else if (columns == 3)							//第三列 显示文件最后更改时间
			{
				QString qModify = tmpFileInfo->lastModified().toString("yyyy-MM-dd hh:mm:ss");

				qTableFile->setItem(rows, columns, new QTableWidgetItem(qModify));
				//qTableFile->item(rows, columns)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
			}
		}
	}

	//开启鼠标滚动事件
	qTableFile->verticalScrollBar()->installEventFilter(this);
}

这里只提供部分代码,博主实现的是文件管理器,可根据自己需求进行修改代码。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值