Qt学习-23 <QAbstractItemView>

本文详细介绍了Qt中的QAbstractItemView类,作为Model-View设计模式的核心组件,展示了如何绑定模型和视图,以及如何处理拖拽、编辑、滚动和选择等功能。同时列举了类的重要属性、方法和信号,帮助开发者更好地理解和使用该类进行界面设计。
摘要由CSDN通过智能技术生成

—均为自学笔记,如有错误请指出


一、介绍

参考文章

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

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

        QAbstractItemView类是一种MV(Model-View)的设计模式框架中的一员,Model模型是应用程序对象,View视图是它的屏幕表示,使用此设计将解耦以增加灵活性和重用性。并且他们自身分别有独立的信号来通知彼此,Model模型通知View视图有关数据源保存的数据的更改,View视图提供有关用户与所显示项目交互的信息。

        QAbstractItemView类提供了对 键盘和鼠标导航、视口滚动、项目编辑和选择的标准支持。

         Model模型都是继承于父类QAbstractItemModel,QAbstractItemView提供setModel ( ) 方法用来设置当前的Model模型

例:(QTableView)

//绑定view和model
QStandardItemModel *model = new QStandardItemModel();
ui->tableView->setModel(model);
 
//view设置标题栏
model->setHorizontalHeaderLabels(QStringList()<<"序列"<<"班级"<<"名称");
//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(model->index(newRow, 0),newRow);//插入数据
model->setData(model->index(newRow, 1),“一班”);//插入数据
model->setData(model->index(newRow, 2),"小明");//插入数据

二、用法

1. 属性

拖拽包含两个功能:拖动(Drag)、放下(Drop)

QTreeWidget拖拽示例

Qt拖拽示例

1). alternatingRowColors

表示是否用交替色绘制项目,默认false

若为true,将会使用QPalette::BaseQPalette::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

表示触发自动滚动时的区域大小,默认值是16px

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)

2. 公共方法

1). currentIndex

返回当前的项目的信息,保存在QModelIndex(项目的行、列、数据、标识、是否有效等信息)

QModelIndex currentIndex() const
2). 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() const
7). 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 = 0
10). visualRect

返回给定索引处的矩形坐标

virtual QRect visualRect(const QModelIndex &index) const = 0
11). indexWidget

返回给定索引处的widget部件

QWidget *indexWidget(const QModelIndex &index) const
12). 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) const
14). setItemDelegate

设置委托,可以在某行、某列或者全部视图

void setItemDelegate(QAbstractItemDelegate *delegate)
void setItemDelegateForColumn(int column, QAbstractItemDelegate *delegate)
void setItemDelegateForRow(int row, QAbstractItemDelegate *delegate)

例:如何使用委托 

实例化委托(实例化委托继承于QStyleItemDelegate)

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() const
22). setRootIndex

设置根索引

void setRootIndex(const QModelIndex &index)
23). update

刷新某索引下的项目

void update(const QModelIndex &index)

3. 信号

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). entered

当鼠标光标进入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()

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值