QT QTableView控件 实时刷新显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT QTableView控件 实时刷新显示相关的知识,希望对你有一定的参考价值。

背景:QT编程,QTableView控件做数据库的显示

QTableView是这样创建的(tableView是QTableView创建的对象):

QStandardItemModel *model;
model=new QStandardItemModel();
ui->tableView->setModel(model);

向tableView里面写数据是使用model->setItem();来对tableView表里面的每一个item进行写。

问题:有大约两万行的数据,每行5列。那么需要执行10万次循环来执行model->setItem()函数,而且问题就在于在进行这10万次循环的时候,主程序是阻塞的,所以很慢。现在希望用什么方法可以给tableView写入100行然后就显示出来,然后每写入100行再显示出来,不阻塞主进程。
求大神解答……

不阻塞,只能多线程了,另外开一个线程,当修改数据的线程将所有数据修改完成后给主线程一个信息,主线程刷新显示。 参考技术A 开一个线程写数据呗,

Qt入门系列开发教程高级控件篇QTableView表格视图

效果图

详细描述

QTableView 实现了一个表格视图,用于显示模型中的项目。 此类用于提供以前由 QTable 类提供的标准表,但使用 Qt 的模型/视图架构提供的更灵活的方法。
QTableView 类是模型/视图类之一,是 Qt 模型/视图框架的一部分。
QTableView 实现了 QAbstractItemView 类定义的接口,以允许它显示从 QAbstractItemModel 类派生的模型提供的数据。

  • 视觉外观

该表有一个可以使用verticalHeader() 函数获得的垂直表头,以及一个可以通过horizontalHeader() 函数获得的水平表头。 使用rowHeight()可以找到表格中每一行的高度; 同样,可以使用 columnWidth() 找到列的宽度。 由于这两个都是普通的小部件,您可以使用它们的 hide() 函数隐藏它们中的任何一个。
可以使用 hideRow()、hideColumn()、showRow() 和 showColumn() 隐藏和显示行和列。 可以使用 selectRow() 和 selectColumn() 选择它们。 该表将根据 showGrid 属性显示一个网格。
与其他项目视图中的项目一样,表格视图中显示的项目是使用标准委托呈现和编辑的。 但是,对于某些任务,有时能够在表格中插入小部件很有用。 使用 setIndexWidget() 函数为特定索引设置小部件,然后使用 indexWidget() 检索小部件。

默认情况下,表格中的单元格不会扩展以填充可用空间。您可以通过拉伸最后一个标题部分使单元格填充可用空间。 使用horizontalHeader() 或verticalHeader() 访问相关标题并设置标题的stretchLastSection 属性。
要根据每列或每行的空间需求分配可用空间,请调用视图的 resizeColumnsToContents() 或 resizeRowsToContents() 函数。

  • 导航

您可以通过用鼠标单击单元格或使用箭头键来浏览表格中的单元格。 因为 QTableView 默认启用 tabKeyNavigation,所以你也可以点击 Tab 和 Backtab 从一个单元格移动到另一个单元格。

  • 坐标系
    对于某些特殊形式的表格,能够在行和列索引以及小部件坐标之间进行转换是很有用的。 rowAt() 函数提供指定行视图内的 y 坐标; 行索引可用于通过 rowViewportPosition() 获取对应的 y 坐标。 columnAt() 和 columnViewportPosition() 函数提供 x 坐标和列索引之间的等效转换操作。

属性

  • cornerButtonEnabled : bool
    该属性保存左上角的按钮是否启用

  • gridStyle : Qt::PenStyle
    此属性保存用于绘制网格的画笔样式。

  • showGrid : bool
    该属性保存是否显示网格

  • sortingEnabled : bool
    此属性保存是否启用排序

  • wordWrap : bool
    此属性保存项目文本自动换行策略

API

//删除表格视图中的所有行和列跨度。
 void clearSpans()
 //返回内容坐标中给定 x 坐标 x 所在的列
 int columnAt(int x) const
 //合并单元格
 int columnSpan(int row, int column) const
 //返回给定列的内容坐标中的 x 坐标。
 int columnViewportPosition(int column) const
 //列宽度
 int columnWidth(int column) const
 //画笔样式
 Qt::PenStyle gridStyle() const
 //表头
 QHeaderView *horizontalHeader() const
 //是否隐藏列
 bool isColumnHidden(int column) const
 //左上角的按钮是否启用
 bool isCornerButtonEnabled() const
//是否隐藏行
 bool isRowHidden(int row) const
 //是否开启排序
 bool isSortingEnabled() const
 //获取第几行
 int rowAt(int y) const
 //获取行高
 int rowHeight(int row) const
//返回 (row, column) 处的表元素的行跨度。 默认值为 1。
 int rowSpan(int row, int column) const
 //返回给定行的内容坐标中的 y 坐标。
 int rowViewportPosition(int row) const
 //设置列隐藏
 void setColumnHidden(int column, bool hide)
 //设置列宽
 void setColumnWidth(int column, int width)
//启用保存左上角的按钮是
 void setCornerButtonEnabled(bool enable)
//设置画笔样式
 void setGridStyle(Qt::PenStyle style)
 //设置水平表头
 void setHorizontalHeader(QHeaderView *header)
//设置第几行行高
 void setRowHeight(int row, int height)
 //第几行显示或隐藏
 void setRowHidden(int row, bool hide)
//开启排序
 void setSortingEnabled(bool enable)
//合并单元格
 void setSpan(int row, int column, int rowSpanCount, int columnSpanCount)
//设置表头对象
 void setVerticalHeader(QHeaderView *header)
//设置换行策略
 void setWordWrap(bool on)
//显示网格
 bool showGrid() const
//获取垂直表头
 QHeaderView *verticalHeader() const
 //获取文本自动换行策略
 bool wordWrap() const

实现的公有虚函数

//返回与内容坐标中位置 pos 处的表项对应的模型项的索引位置。
 virtual QModelIndex indexAt(const QPoint &pos) const override
 //确保给定的索引在表格视图中可见,必要时滚动。
 virtual void scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint = EnsureVisible) override
 
 virtual void setModel(QAbstractItemModel *model) override
 
 virtual void setRootIndex(const QModelIndex &index) override
 virtual void setSelectionModel(QItemSelectionModel *selectionModel) override
 //返回给定索引占用的视口上的矩形。 如果索引隐藏在视图中,它将返回一个空 QRect。
 virtual QRect visualRect(const QModelIndex &index) const override

公有槽

//隐藏第几列
 void hideColumn(int column)
 //隐藏第几行
 void hideRow(int row)
 //根据用于呈现列中每个项目的委托的大小提示调整给定列的大小。
 void resizeColumnToContents(int column)
  //根据用于呈现所有项目的委托的大小提示调整给定列的大小。
 void resizeColumnsToContents()
 // 根据用于呈现列中每个项目的委托的大小提示调整给定行的大小。
 void resizeRowToContents(int row)
 //根据用于呈现所有项目的委托的大小提示调整给定行的大小。
 void resizeRowsToContents()
 //选择第几列
 void selectColumn(int column)
 //选择第几行
 void selectRow(int row)
 //设置显示网格
 void setShowGrid(bool show)
 //显示第几列
 void showColumn(int column)
 //显示第几行
 void showRow(int row)
// 第几列排序
 void sortByColumn(int column, Qt::SortOrder order)

以上是关于QT QTableView控件 实时刷新显示的主要内容,如果未能解决你的问题,请参考以下文章

QT自定义QTextEdit实现大数据的实时刷新显示

QT界面在多线程下的实时刷新

Qtablewidget设置颜色交替

qtabelwidget怎么得到指定行和列的值

QT QTableview QItemDelegate 简单使用

Qt QTableView 表格内添加控件