Я сталкиваюсь со странной вещью, когда динамически добавляю элементы в мою QStandardItemModel и показываю их с помощью QTableView. Если время между событиями достаточно велико (например, 50 мс), то представление можно прокручивать, но в случае более быстрого события (10 мс) оно всегда прокручивается вниз и не позволяет мне что-либо делать.
Вот простой фрагмент кода:
main. cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#include <QMainWindow>
#include <QTimer>
#include <QTableView>
#include <QStandardItemModel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QTimer dataTimer;
QStandardItemModel *model;
QTableView *view;
public slots:
void insertData();
};
mainwindow. cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
view = new QTableView(this);
this->setCentralWidget(view);
model = new QStandardItemModel(this);
model->setColumnCount(1);
view->setModel(model);
QObject::connect(&dataTimer, &QTimer::timeout, this, &MainWindow::insertData);
dataTimer.start(10); // 50 here gives correct behaviour while 10 does not
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::insertData()
{
QList<QStandardItem *> items;
items.append(new QStandardItem(QTime::currentTime().toString("hh:mm:ss.zzz")));
model->insertRow(0, items);
if (model->rowCount() > 20){
model->removeRow(model->rowCount()-1);
}
}
dataTimer.start (50) работает нормально, а dataTimer.start (10) тормозит поведение. Это для моего ноутбука и, возможно, для кого-то другого числа будут другими, но я думаю, что logi c понятен.
Я думал, что это слишком быстро, и некоторые методы, такие как beginInsertRows (), не ' не работает хорошо. Но это обычно для нестандартных моделей, а здесь это просто стандарт.
Может кто-нибудь сказать мне, почему это происходит? Спасибо