Qt实现小功能之列表无限加载(创意很不错:监听滚动条事件,到底部的时候再new QListWidgetItem)

概念介绍

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

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

实现思路

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

// 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处的信号通知主窗体更新滚动条的当前位置值。

接下来是主窗体的实现:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

// 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++)

    {

        temp = new QListWidgetItem();

        temp->setText("hello_"+QString::number(i));

        ui.listWidget->insertItem(i, temp);

    }

}

  这里从QListWidget中派生出了一个新的子类,记得在UI designer中对QListWidget组件进行提升(promote)。在Promote to...的时候填写我们派生出来的子类MListWidget。

实际效果

鼠标滚动到底部的时候,每次插入5条数据。

Qt-vs-addin的小问题

使用Visual Studio进行Qt开发的时候,需要安装一个插件。然而有时候这个插件的一些工具却莫名其妙的失效:

其中qt5appwrapper.exe用于编辑Qt工程中的UI文件,也就是Qt Designer;qt5rceditor.exe则用于编辑Qt资源文件。此时在VS中却无法正常打开,并报如上错误。具体的原因不知道是什么,修复的方法如下:

对工程中的*.ui文件或*.qrc文件右键,选择“打开方式...”,弹出如下对话框,并点击“添加...”按钮,选择qt-vs-addin的安装目录,找到上述的两个可执行文件:

至此,添加完毕。记得将新添加的这个程序设置为默认值,也就是默认的打开工具。

参考

  • 瀑布流与无限加载的结合案例:http://down.admin5.com/demo/code_pop/18/745/

http://www.cnblogs.com/csuftzzk/p/qt_infinitescroll.html

时间: 2024-12-28 01:53:02

Qt实现小功能之列表无限加载(创意很不错:监听滚动条事件,到底部的时候再new QListWidgetItem)的相关文章

Vue.js 开发实践:实现精巧的无限加载与分页功能

https://segmentfault.com/a/1190000005351971#articleHeader9 本篇文章是一篇Vue.js的教程,目标在于用一种常见的业务场景--分页/无限加载,帮助读者更好的理解Vue.js中的一些设计思想.与许多Todo List类的入门教程相比,更全面的展示使用Vue.js完成一个需求的思考过程:与一些构建大型应用的高阶教程相比,又更专注于一些零碎细节的实现,方便读者快速掌握.致用. 需求分析 当一个页面中信息量过大时(例如一个新闻列表中有200条新闻

[DIV/CSS] Vue.js 开发实践:实现精巧的无限加载与分页功能

本篇文章是一篇Vue.js的教程,目标在于用一种常见的业务场景--分页/无限加载,帮助读者更好的理解Vue.js中的一些设计思想.与许多Todo List类的入门教程相比,更全面的展示使用Vue.js完成一个需求的思考过程:与一些构建大型应用的高阶教程相比,又更专注于一些零碎细节的实现,方便读者快速掌握.致用. 需求分析 当一个页面中信息量过大时(例如一个新闻列表中有200条新闻需要展示),就会产生问题,例如: 数据量过大,影响加载速度 用户体验差,很难定位到之前自己看过的某篇文章 扩展性差,如

JRoll 2 使用文档(史上最强大的下拉刷新,滚动,无限加载插件)

概述 说明 JRoll,一款能滚起上万条数据,具有滑动加速.回弹.缩放.滚动条.滑动事件等功能,兼容CommonJS/AMD/CMD模块规范,开源,免费的轻量级html5滚动插件. JRoll第二版是在JRoll第一版基础上重写JRoll滑动算法,基于时间运动,解决帧频降低时滑动缓慢的问题,更改垂直水平方向判断方法,使捕获垂直水平方向更准确灵敏. JRoll第二版增减了一些api不完全兼容JRoll第一版. 先睹为快 http://www.chjtx.com/JRoll/demos/ 运行示例

10几款网站瀑布流布局图片无限加载动效

jQuery选项卡形式图片瀑布流布局选项卡切换效果代码 jquery masonry瀑布流插件制作图片瀑布流布局代码 原生js简单瀑布流图片无限加载带鼠标悬停图片遮罩效果 jquery masonry瀑布流插件制作图片瀑布流布局代码 jquery柔韧性的图片滑动瀑布流布局 jquery时间轴插件文字图片瀑布流布局时间轴特效(不兼容IE678) modernizr html5图片预加载瀑布流布局鼠标悬停动画效果代码 jquery.waterfall.js自动底部填充对齐的瀑布流布局代码 jquer

JS实现-页面数据无限加载

在手机端浏览网页时,经常使用一个功能,当我们浏览京东或者淘宝时,页面滑动到底部,我们看到数据自动加载到列表.之前并不知道这些功能是怎么实现的,于是自己在PC浏览器上模拟实现这样的功能.先看看浏览效果: 当滚动条滚动到页面底部时,提示“正在加载…”. 当页面已经加载了所有数据后,滚动到页面底部会提示“数据已加载到底了”: 实现数据无限加载的过程大致如下: 1.滚动条滚动到页面底部. 2.触发ajax加载,把请求返回的数据加载到列表后面. 如何判断滚动条是否滚动到页面底部?我们可以设置一个规则:当滚

Linux # Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso

问题: Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso 分析:通过分析日志,%vbox_path%\VirtualBox Guest Additions\install_drivers.log发现, 查看安装过程中的信息,如下图,发现缺少 相关dll文件, Linux # Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso,布布扣,bubuko.com Linux # Virtul Box 安

virtualbox安装增强功能时【未能加载虚拟光盘】

virtualbox安装增强功能时[未能加载虚拟光盘] 今天在使用Virtualbox中的Ubuntu虚拟机,想安装增强功能来实现更改分辨率,但是在安装时出错:未能加载虚拟光驱 VBoxsGuestAdditions.iso到虚拟电脑 经过折腾,最后通过互联网找到了解决方法: 进入系统在侧边找到如图加载的虚拟光驱,右击,点击弹出,然后就可正常安装增强功能了 点击安装增强功能 点击"运行" 输入登录系统的密码,点击授权,就开始自动安装了 如图,为安装界面,安装完成后按下回车键,就按照成功

移动端无限加载教程

-------页面滚动到底部 查询数据 无限加载 没有底部显示 没有更多-------- 原理:1.输入url进入页面 2.一进页面就ajax--控制器---查询数据库---控制器得到数据 进行html标签拼接 ajax返回给html3.ajax得到拼接串 添加到指定位置 显示 4.js获取窗口大小 当滚动到底部 再次ajax---控制器---数据库---控制器---html5.ajax得到拼接串 添加到指定位置 显示 如果ajax返回空 在底部div显示没有更多数据 以下是实例1:<!DOCT

jQuery实现无限加载瀑布流特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-