#include #include #include #include #include #include #include #include #include class Model : public QAbstractListModel { Q_OBJECT int rows = 0; QTimer timer; public: Model(QWidget* parent = nullptr) : QAbstractListModel(parent) { connect(&timer, &QTimer::timeout, this, &Model::update); timer.start(1); } int rowCount(const QModelIndex& parent = QModelIndex()) const override { return parent.isValid() ? 0 : rows; } QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override { if (role == Qt::DisplayRole) return QString::number(index.row()); return {}; } QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const { if (role == Qt::SizeHintRole) { return QSize(100, 18); } return QAbstractListModel::headerData(section, orientation, role); } Q_SLOT void update() { beginResetModel(); rows = rand() % 100000; endResetModel(); // beginInsertRows({}, 0, 99); // rows += 100; // endInsertRows(); } }; class MainWidget : public QWidget { Q_OBJECT public: explicit MainWidget() { auto layout = new QVBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); auto bar = new QToolBar(this); layout->addWidget(bar); auto btn = new QToolButton(bar); btn->setIcon(QIcon::fromTheme("edit-undo")); bar->addWidget(btn); auto view = new QTableView(this); layout->addWidget(view); auto model = new Model(this); view->setModel(model); view->setVerticalScrollMode(QAbstractItemView::ScrollPerItem); setLayout(layout); } }; int main(int argc, char* argv[]) { QApplication app(argc, argv); qApp->setStyle(QStyleFactory::create("Fusion")); MainWidget w; w.show(); return app.exec(); } #include "test.moc"