Я хотел бы отметить, что модель списка не должна (и не знает) ничего о действиях пользователя, которые обрабатываются представлением.
Предположим, у нас есть очень простая модель:
#include <QAbstractListModel>
class Model : public QAbstractListModel
{
Q_OBJECT
QStringList list;
public:
Model()
{
//adds 100 items
for(int i=0; i<100; i++)
list << QString("ITEM #") + QString::number(i+1);
}
int rowCount(const QModelIndex &parent) const
{
return list.size();
}
QVariant data(const QModelIndex &index, int role) const
{
if(index.isValid() && (role == Qt::DisplayRole))
{
int row = index.row();
if(row < list.size())
{
return list[row];
}
}
return QVariant();
}
public slots:
void scrolledToEnd()
{
//adds 10 more items
int count = list.size();
for(int i=count; i<(count + 10); i++)
list << QString("ITEM #") + QString::number(i+1);
emit layoutChanged();
}
};
Как видите, я добавил слот scrolledToEnd
, который будет вызываться, когда пользователь прокручивает представление до конца. В модель добавляются дополнительные элементы, и выдается сигнал layoutChanged
для обновления представления. Предполагается, что слот связан с сигналом, который излучается каким-либо объектом, который контролирует вертикальную полосу прокрутки представления.
Итак, давайте разместим QTableView
в QMainWindow
пользовательском интерфейсе и дадим окну слот и сигнал вроде этих:
public slots:
void scrollValueChanged(int value);
signals:
void scrolledToEnd();
В конструкторе окна мы устанавливаем модель представления для нового экземпляра нашего класса Model
:
ui->setupUi(this);
Model * model = new Model();
ui->tableView->setModel(model);
затем подключите сигнал valueChanged
verticalScrollBar
представления к слоту scrollValueChanged
окна:
connect(ui->tableView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollValueChanged);
и сигнал scrolledToEnd
окна в слот scrolledToEnd
модели:
connect(this, &MainWindow::scrolledToEnd, model, &Model::scrolledToEnd);
В реализации оконного слота, если полоса прокрутки достигает своего максимального значения, выдается сигнал scrolledToEnd
:
void MainWindow::scrollValueChanged(int value)
{
if(value==ui->tableView->verticalScrollBar()->maximum())
{
emit scrolledToEnd();
}
}
Сигнал будет пойман слотом модели, и к модели будет добавлен новый набор из десяти предметов.
person
p-a-o-l-o
schedule
17.04.2018
dataChanged
- person Simon   schedule 17.04.2018QTableView
или что-то еще? - person p-a-o-l-o   schedule 17.04.2018