QAbstractItemView,QTableView

来源:互联网 发布:windows找不到runtime 编辑:程序博客网 时间:2024/05/22 16:04

    • QAbstractItemView
    • QTableView

QAbstractItemView

QAbstractItemView类为项视图类提供了基本的功能。

QAbstractItemView是每一个使用QAbstractItemModel的标准视图的基类。QAbstractItemView是抽象类从而不能实例化。通过信号与槽机制,它提供一个标准的接口与model进行交互操作,使子类能够在模型的变化中保持最新。这个类为键盘和鼠标导航、窗口滚动、项编辑和选择提供了标准支持。键盘导航实现了这个功能:

注意,上面的表格假设选择模式允许操作。例如,你不能选择任何项如果选择模式是QAbstractItemView::NoSelection。

QAbstractItemView同样也是模型视图架构中的模型视图类之一。
继承QAbstractItemView的视图类只需要实现它们自己的特定的视图功能,比如绘制items,返回item的尺寸,查找item等。

QAbstractItemView提供一些公有槽,如edit(),setCurrentIndex()。也提供很多的保护槽,包括dataChanged(),rowsInserted(),rowsAboutToRemoved(),selectionChanged(),和currentChanged()。

根item由rootIndex()返回,当前item由currentIndex()返回。确保item对使用scrollTo()是可见的。
QAbstractItemView的一些函数与滚动有关,如 setHorizontalScrollMode()和setVerticalScrollMode()。为了设置scroll bars的范围,可以重新实现view的resizeEvent()函数。

void MyView::resizeEvent(QResizeEvent *event)
{
horizontalScrollBar()->setRange(0, realWidth - width());
...
}

有一点要注意,该设定范围只有widget被显示的时候才更新。

其他几个函数涉及到选择控制,如setSelectionMode(),setSelectionBehavior()。这个类提供了一个默认的选择模型来处理(selectionModel()),但是能够通过使用setSelectionModel()和一个实例化的QItemSelectionModel来替换。
为了完全控制显示和编辑条目,可以使用setItemDelegate()指定一个委托。
QAbstractItemView提供了许多受保护的函数,有些涉及编辑。如edit(),和commitData()。同时还有其他的键盘和鼠标的事件处理器。

注意:如果你继承了QAbstractItemView并试图去更新视口的内容,你应该使用viewport->update()而不是update()函数,因为所有的绘制操作都发生在viewport上。

QTableView

QTableView类继承自QAbstractItemView。为table视图提供默认的模型/视图实现。

QTableView实现一个显示模型项数据的表视图,这个类提供之前由QTable类提供的标准表,不同的是使用了由Qt模型视图架构提供的更灵活方法。同样该类是Qt模型视图架构中model/view类之一。

QTableView类继承自QAbstractItemModel,实现了基类定义的接口,允许展示models提供的数据。

导航
可以通过鼠标点击来导航单元格,或者通过箭头键。因为QTableView默认使能了tabKeyNavigation,也能够点击Tab和Backtab在单元格间移动。

可视化外观
 Table可通过verticalHeader()函数获得一个垂直的头部,以horizontalHeader()函数获得一个水平的头部。通过rowHeight()和columnWidth()获取行列高度和宽度。因为这两者都是普通部件,能够使用hide()函数隐藏它们。

 可以使用hideRow(), hideColumn(), showRow(),showColumn()来隐藏或显示行列。selectRow() 和 selectColumn()选择行列,showGrid函数决定是否显示网格。
表视图中的项,和其他项视图一样,使用标准的delegate来渲染和编辑。
然而,对于某些任务,在表中插入widget是很有用的。这些widgets用setIndexWidget()函数设置为特别的index,之后用indexWidget检索。

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

坐标系统
 对于一些专业的表格,能够在行列索引和widget坐标间转换是很有用的。rowAt()函数在指定行视图中提供y坐标,行索引可以用rowViewportPosition()来获得一个与之相对应的y坐标。columnAt()和columnViewportPosition()在x坐标和列索引间提供同等的转换。

原创粉丝点击