第一步:先在头文件定义事件过滤器,使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);
}
这里只提供部分代码,博主实现的是文件管理器,可根据自己需求进行修改代码。