一、前言
QAbstractItemView类继承于QWidget,为全部视图类提供了基本的功能。

QAbstractItemView类是一个抽象类,不能被实例化使用,它是QtWidget框架中树视图QTreeView、列表视图QListView、表格视图QTableView、单列视图QColumnView和标题头QHeaderView这些视图框架的虚拟父类。

QAbstractItemView类提供了对键盘和鼠标导航、视口滚动、项目编辑和选择的标准支持。
QAbstractItemView类是一种MV(Model-View)的设计模式框架中的一员,Model模型是应用程序对象,View视图是它的屏幕表示,使用此设计将解耦以增加灵活性和重用性。并且他们自身分别有独立的信号来通知彼此,Model模型通知View视图有关数据源保存的数据的更改,View视图提供有关用户与所显示项目交互的信息。
更多详细的信息在help中搜索“Model/View Programming”。

Model模型都是继承于父类QAbstractItemModel,QAbstractItemView提供setModel()方法用来设置当前的Model模型,下面是一个view+model的一个示例代码,使用子类QTableView。
//绑定view和model
QStandardItemModel *model = new QStandardItemModel();
ui->tableView->setModel(model);
//view设置标题栏
m_tableModel->setHorizontalHeaderLabels(QString()<<"序列"<<"班级"<<"名称");
//view设置标题栏缩放策略
ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
//view设置视图样式
ui->tableView->setColumnWidth(0,40);//设置第一列宽度
ui->tableView->setColumnWidth(1,40);//设置第二列宽度
//model插入数据
int newRow = model->rowCount();//获取当前行数
model->insertRow(newRow, QModelIndex());//插入一行
model->setData(m_tableModel->index(newRow, 0),newRow);//插入数据
model->setData(m_tableModel->index(newRow, 1),“一班”);//插入数据
model->setData(m_tableModel->index(newRow, 2),"小明");//插入数据继承QAbstractItemView的视图类只需要实现它们自己特定于视图的功能,比如绘制项目、返回项目的几何形状、查找项目等。
二、QAbstractItemView
属性
1)alternatingRowColors
该属性表示是否用交替色绘制项目,默认为false。
如果设置为true,那么将会使用QPalette::Base和QPalette::AlternateBase颜色绘制,否则的话默认为QPalette::Base作为背景颜色。
bool alternatingRowColors() const
void setAlternatingRowColors(bool enable) 
  
2)autoScroll
该属性表示是否拖拽自动滚动视图的内容,默认为true。
如果用户在viewport边缘的autoScrollMargin(默认16像素)范围内拖动,将会自动滚动视图的内容,如果当前项发生变化,则视图将自动滚动以确保当前项完全可见。该属性仅在view接受drop时有效,通过setAcceptDrops()将此属性设置为false来关闭自动滚动。
bool hasAutoScroll() const
void setAutoScroll(bool enable)3)autoScrollMargin
该属性表示触发自动滚动时的区域大小,默认值是16像素。
int autoScrollMargin() const
void setAutoScrollMargin(int margin)4)defaultDropAction
该属性表示拖放的触发动作策略,默认为没有设置任何策略。
Qt::DropAction defaultDropAction() const
void setDefaultDropAction(Qt::DropAction dropAction)5)dragDropMode
该属性表示拖放事件的模式。
QAbstractItemView::DragDropMode dragDropMode() const
void setDragDropMode(QAbstractItemView::DragDropMode behavior)6)dragDropOverwriteMode
该属性表示拖放事件的数据覆盖行为使能,默认为false,QTableView默认为true。
值为true,则所选数据将在放置的时候覆盖现有项目数据,当数据被移动时,项目也被删除。
值为false,则所选数据将在放置的时候将作为新项插入,当数据被移动时,项目也被删除。
bool dragDropOverwriteMode() const
void setDragDropOverwriteMode(bool overwrite)7)dragEnabled
该属性表示是否支持拖动其自己的项。
bool dragEnabled() const
void setDragEnabled(bool enable)8)showDropIndicator
该属性表示显示拖放项时是否显示拖放指示器。
bool showDropIndicator() const
void setDropIndicatorShown(bool enable)9)editTriggers
该属性项目编辑策略。
QAbstractItemView::EditTriggers editTriggers() const
void setEditTriggers(QAbstractItemView::EditTriggers triggers)10)horizontalScrollMode
该属性表示水平方向视图如何滚动其内容,ScrollPerItem根据项滚动,ScrollPerPixel根据像素滚动。
QAbstractItemView::ScrollMode horizontalScrollMode() const
void setHorizontalScrollMode(QAbstractItemView::ScrollMode mode)
void resetHorizontalScrollMode()11)verticalScrollMode
该属性表示垂直方向视图如何滚动其内容,ScrollPerItem根据项滚动,ScrollPerPixel根据像素滚动。
QAbstractItemView::ScrollMode verticalScrollMode() const
void setVerticalScrollMode(QAbstractItemView::ScrollMode mode)
void resetVerticalScrollMode()12)iconSize
该属性表示项目的图标的尺寸。
QSize iconSize() const
void setIconSize(const QSize &size)13)selectionBehavior
该属性表示视图的选择行为。
QAbstractItemView::SelectionBehavior selectionBehavior() const
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)14)selectionMode
该属性表示视图的选择模式。
QAbstractItemView::SelectionMode selectionMode() const
void setSelectionMode(QAbstractItemView::SelectionMode mode)15)tabKeyNavigation
该属性表示是否启用带有制表符和后退制表符的项导航。
bool tabKeyNavigation() const
void setTabKeyNavigation(bool enable)16)textElideMode
该属性表示省略文本中“…”的位置,默认值为Qt::ElideRight。
Qt::TextElideMode textElideMode() const
void setTextElideMode(Qt::TextElideMode mode)公共方法
1)currentIndex
返回当前的项目的信息,保存在QModelIndex(项目的行、列、数据、标识、是否有效等信息)。
QModelIndex currentIndex() const2)setCurrentIndex
设置当前的项目,并且选中它,如果当前选择模式是NoSelection则该方法无效。
void setCurrentIndex(const QModelIndex &index)如果需要设置某一项为当前项但是又不要选中它,可以这么使用。
selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);3)selectionModel
返回当前选中项目的模型,保存在QItemSelectionModel。
QItemSelectionModel *selectionModel() const如果需要设置某一项为当前项但是又不要选中它,可以这么使用。
selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);4)setSelectionModel
将当前选择模型设置为给定的selectionModel,如果使用了setModel()设置模型,模型将会被替换。
void setSelectionModel(QItemSelectionModel *selectionModel)5)clearSelection
清除选中的项目,currentIndex不会被改变。
void clearSelection()6)model
返回设置的模型。
QAbstractItemModel *model() const7)setModel
设置视图模型,替换之前的默认模型。
void setModel(QAbstractItemModel *model)旧的模型如果不用的话,需要删除它,模型的使用参考开头示例。
QItemSelectionModel *m = view->selectionModel();
view->setModel(new model);
delete m;8)closePersistentEditor
关闭给定索引处项的持久编辑器。
void closePersistentEditor(const QModelIndex &index)9)indexAt
返回给定坐标出的索引。
virtual QModelIndex indexAt(const QPoint &point) const = 010)visualRect
返回给定索引处的矩形坐标。
virtual QRect visualRect(const QModelIndex &index) const = 011)indexWidget
返回给定索引处的widget部件。
QWidget *indexWidget(const QModelIndex &index) const12)setIndexWidget
设置给定索引处的widget部件。
void setIndexWidget(const QModelIndex &index, QWidget *widget)比如我们可能需要视图某个位置是一个编辑框或者是一个下拉框。
setIndexWidget(index, new QLineEdit);13)itemDelegate
根据索引、行、列返回项目委托
QAbstractItemDelegate *itemDelegate() const
QAbstractItemDelegate *itemDelegate(const QModelIndex &index) const
QAbstractItemDelegate *itemDelegateForColumn(int column) const
QAbstractItemDelegate *itemDelegateForRow(int row) const14)setItemDelegate
设置委托,可以在某行、某列或者全部视图。
void setItemDelegate(QAbstractItemDelegate *delegate)
void setItemDelegateForColumn(int column, QAbstractItemDelegate *delegate)
void setItemDelegateForRow(int row, QAbstractItemDelegate *delegate)下面示例演示如何使用委托。
实例化委托继承于QStyledItemDelegate。
void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const
{
     if (index.column() == 1) {
         int progress = index.data().toInt();
         QStyleOptionProgressBar progressBarOption;
         progressBarOption.rect = option.rect;
         progressBarOption.minimum = 0;
         progressBarOption.maximum = 100;
         progressBarOption.progress = progress;
         progressBarOption.text = QString::number(progress) + "%";
         progressBarOption.textVisible = true;
         QApplication::style()->drawControl(QStyle::CE_ProgressBar,
                                            &progressBarOption, painter);
     } else
         QStyledItemDelegate::paint(painter, option, index);
}
设置委托。
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止修改
ui->tableWidget->setColumnCount(2);//只设置列数
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<tr("Log")<<tr("progress"));
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置action菜单模式
ui->tableWidget->verticalHeader()->setCascadingSectionResizes(false);
ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableWidget->verticalHeader()->setMaximumSectionSize(30);
ui->tableWidget->verticalHeader()->setMinimumSectionSize(30);
ui->tableWidget->verticalHeader()->setMaximumWidth(20);
ui->tableWidget->verticalHeader()->setMinimumWidth(20);
ui->tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
ui->tableWidget->horizontalHeader()->setMaximumHeight(31);
ui->tableWidget->horizontalHeader()->setMinimumHeight(31);
ui->tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
ui->tableWidget->setItemDelegate(new WidgetDelegate());
addstr("cook dev",100);
addstr("cook dev",50);
addstr("cook dev",25);void MainWindow::addstr(QString str,int progress)
{
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止修改
    int RowCont = ui->tableWidget->rowCount();
    ui->tableWidget->setItem(RowCont,0,new QTableWidgetItem(str));
    ui->tableWidget->setItem(RowCont,1,new QTableWidgetItem(QString::number(progress)));
    ui->tableWidget->item(RowCont,0)->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter);
    ui->tableWidget->scrollToBottom();
}
15)clearSelection
取消全部项目被选中的状态,但是当前项currentIndex不会改变。
void clearSelection()16)edit
开始对索引下的项目编辑。
void edit(const QModelIndex &index)17)reset
重置视图的状态,包括打开的编辑器,滚动条位置,选择等。现有的更改将不会提交。如果您想在重置视图时保存更改,您可以重新实现此函数,提交更改,然后调用父类的实现。
virtual void reset()18)scrollToBottom
滚动到底部。
void scrollToBottom()19)scrollToTop
滚动条到顶部。
void scrollToTop()20)selectAll
选择全部。
virtual void selectAll()21)rootIndex
返回根索引。
QModelIndex rootIndex() const22)setRootIndex
设置根索引。
void setRootIndex(const QModelIndex &index)23)update
刷新某索引下的项目
void update(const QModelIndex &index)信号
1)activated
当索引index指定的项目被用户激活时,就会发出这个信号。如何激活项目取决于平台;例如,单点或双击项目,或在项目处于当前状态时按回车键。
void activated(const QModelIndex &index)2)clicked
当左键单击鼠标按钮时发出该信号。鼠标所单击的项由index指定。该信号仅在索引有效时发出。
void clicked(const QModelIndex &index)3)doubleClicked
该信号在双击鼠标按钮时发出。鼠标双击的项由index指定。该信号仅在索引有效时发出。
void doubleClicked(const QModelIndex &index)4)doubleClicked
当鼠标光标进入index指定的项时发出此信号。鼠标跟踪需要启用此功能才能工作。
void entered(const QModelIndex &index)5)iconSizeChanged
使用setIconSize改变图标尺寸的时候触发该信号。
void iconSizeChanged(const QSize &size)6)pressed
这个信号在按下鼠标按钮时发出。按下鼠标的项由index指定。该信号仅在索引有效时发出。
void pressed(const QModelIndex &index)7)viewportEntered
当鼠标光标进入视口viewport时发出此信号,需要启用鼠标跟踪,此信号才会触发。
void viewportEntered()








