Qt实现⼩功能之列表⽆限加载(创意很不错:监听滚动条事件,到底部的时候再newQListW。。。
概念介绍
⽆限加载与瀑布流的结合在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
{
jquery滚动条滚动到底部
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)。在的时候填写我们派⽣出来的⼦类MListWidget。
实际效果
⿏标滚动到底部的时候,每次插⼊5条数据。
参考
瀑布流与⽆限加载的结合案例:down.admin5/demo/code_pop/18/745/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。