qt - QTableView 和 QStandardItemModel 的问题
问题描述
动态地将项目添加到我的 QStandardItemModel 并使用 QTableView 显示它们时,我遇到了奇怪的事情。如果事件之间的时间足够长(如 50 毫秒),那么视图是可滚动的,但在更快的事件(10 毫秒)的情况下,视图总是向下滚动并且不允许我做任何事情。
所以这里是简单的代码片段:
主文件
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
主窗口.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();
};
主窗口.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) 制动行为。它适用于我的笔记本电脑,也许对于其他人来说,数字会有所不同,但我认为逻辑很清楚。
我在想它有点太快了,像 beginInsertRows() 这样的一些方法效果不佳。但这通常适用于定制模型,这里只是一个标准模型。
有人能告诉我为什么会这样吗?谢谢
解决方案
在 GUI 线程中设置 10 毫秒计时器来影响 GUI 元素本身就是一个坏主意。例如,在 Windows 10 毫秒超时是无法通过标准方式实现的。您的用户是否真的需要每秒超过 1 次查看某些表数据的更新?他真正需要的是什么?在此基础上,您应该确定优化方法。
然后你可以选择:
- 减少计时器的超时并影响每个事件的几行。无论如何,您似乎必须减少 GUI 计时器的超时。
- 提前定期保留所需的行数,例如通过
model->setRowCount(n)
; 通过setUpdatesEnabled()方法暂时禁用表刷新:
设置更新启用(假);
大视觉变化();
setUpdatesEnabled(true);子类化 Qt 模型类之一并重新实现insertRows()或更多。
阅读
获取更多示例。
Qt 模型/视图编程。
推荐阅读
- bots - Discord.js v12 类型错误突击队
- c# - c# discord.net 如何在执行命令时获取输入
- javascript - 制作返回姓名首字母的正则表达式的最佳方法是什么?
- c# - Xamarin Forms - 创建具有复杂数据绑定的自定义条目列 sfdatagrid
- python - 使用索引日期时间从 pandas 数据帧创建 json
- logging - Slack 上的 Datadog 指标监控通知,带有指向日志浏览器的链接
- python-3.x - 试图找出两个日期之间的时间,然后让它们在 python 中可读
- css - 为什么我的反应原生项目中没有应用背景图像
- msgpack - c# MessagePack-CSharp 获取 MessagePackDynamicObjectResolverException:找不到匹配的构造函数。类型:System.String
- javascript - 监听窗口对象属性更改/创建