相关文章推荐
飘逸的斑马  ·  图文详解:肾动脉变异特点_副肾·  1 年前    · 
率性的水煮鱼  ·  《不当舔狗后,我成了亿万神豪》漫画全集 - ...·  2 年前    · 
高大的日记本  ·  从未见过如此大开眼界的电影!·  2 年前    · 
温暖的书包  ·  小米手环和苹果手表哪个准_头条·  2 年前    · 
一身肌肉的茶叶  ·  《明日家族四季首聚演唱会》盛大落幕 ...·  2 年前    · 
Code  ›  Qt实现小功能之列表无限加载开发者社区
滚动条 qlistwidget
https://cloud.tencent.com/developer/article/1022904
很拉风的沙滩裤
2 年前
作者头像
24K纯开源
0 篇文章

Qt实现小功能之列表无限加载

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 24K纯开源 > Qt实现小功能之列表无限加载

Qt实现小功能之列表无限加载

作者头像
24K纯开源
发布 于 2018-01-18 10:19:06
2.3K 0
发布 于 2018-01-18 10:19:06
举报

概念介绍

无限加载与瀑布流的结合在Web前端开发中的效果非常新颖,对于网页内容具备较好的表现形式。无限加载并没有一次性将内容全部加载进来,而是通过监听滚动条事件来刷新内容的。当用户往下拖动滚动条或使用鼠标滚轮的时候,页面会自动加载剩余的内容。如下:

简约而不简单,正是这种别出心裁,突破常规的设计才能得到用户的青睐……

实现思路

在前端开发可以使用一些jQuery插件实现这种效果,后台只需要准备好数据就行了。在Qt中如何给列表组件(QListWidget,QTreeWidget, QTableWidget)或试图(QListView, QTreeView, QTableView)添加这样的效果呢?上面的无限加载的核心原理其实就是使用javascript侦听浏览器的滚动条事件。那么在Qt里面这样做就简单了。我们知道Qt中有一个基类叫做QAbstractScrollArea,它是一个代表可滚动区域的抽象基类。因此,这个类中有许多和滚动条操作相关的方法。QAbstractScrollArea恰好又是Q*View的父类,这正好为我们提供了操作滚动条的机会。

新建一个基于窗体的Qt应用程序工程,并从QListWIdget派生出一个子类:MListWidget。为什么呢?因为我们打算对鼠标滚轮事件作出一点点不一样的动作:当滚动条滚动的时候在主窗口的lineEdit中更新滚动条的当前位置;当滚动条滚到最底端的时候发送一个信号,以此更新ListWidget中的数据内容。

// mlistwidget.h
class MListWidget : public QListWidget
	Q_OBJECT
public:
	MListWidget(QWidget *parent);
	~MListWidget();
signals:
	void msliderChanged(int p);
	void reachedBottom();
private slots:
	void onSliderChanged(int p);
private:
	QScrollBar* m_vscrollBar;
// mlistwidget.cpp
MListWidget::MListWidget(QWidget *parent)
	: QListWidget(parent)
 	m_vscrollBar = verticalScrollBar(); // 保持垂直滚动条
	connect(m_vscrollBar, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int)));
void MListWidget::onSliderChanged(int p)
	int startRow = count();
	if (p == m_vscrollBar->maximum())
		//QMessageBox::information(this, "Warning", "You reached the bottom of the vertical scroll bar!");
		emit reachedBottom(); // 1
	emit msliderChanged(p);  // 2
}

注释1处发送了一个信号reachedBottom(),通知主窗体给ListWidget添加新的内容;注释2处的信号通知主窗体更新滚动条的当前位置值。

接下来是主窗体的实现:

// testscrollbar.h
class TestScrollBar : public QMainWindow
	Q_OBJECT
public:
	TestScrollBar(QWidget *parent = 0);
	~TestScrollBar();
private slots:
	void onScrollBarMoved(int);
	void onReachedBottom();
private:
	Ui::TestScrollBarClass ui;
// testscrollbar.cpp
TestScrollBar::TestScrollBar(QWidget *parent)
	: QMainWindow(parent)
	ui.setupUi(this);
	QListWidgetItem* temp;
	for (int i = 0; i < 100; i++)
		temp = new QListWidgetItem();
		temp->setText("zhangzhongke_"+QString::number(i));
		ui.listWidget->insertItem(i, temp);
	connect(ui.listWidget, SIGNAL(msliderChanged(int)), this, SLOT(onScrollBarMoved(int)));
	connect(ui.listWidget, SIGNAL(reachedBottom()), this, SLOT(onReachedBottom()));
void TestScrollBar::onScrollBarMoved(int v)
	ui.lineEdit->setText(QString::number(v));
//  更新ListWidget中的内容,插入新数据到最后
void TestScrollBar::onReachedBottom()
	QListWidgetItem* temp;
	int startRow = ui.listWidget->count();
	for (int i = startRow; i < startRow+5; i++)
 
推荐文章
飘逸的斑马  ·  图文详解:肾动脉变异特点_副肾
1 年前
率性的水煮鱼  ·  《不当舔狗后,我成了亿万神豪》漫画全集 - 免费在线漫画 - 古古漫画网
2 年前
高大的日记本  ·  从未见过如此大开眼界的电影!
2 年前
温暖的书包  ·  小米手环和苹果手表哪个准_头条
2 年前
一身肌肉的茶叶  ·  《明日家族四季首聚演唱会》盛大落幕 毛不易周震南再唱《盛夏》_明子
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号