QStandardItemModel定义了一些标准的角色,而QAbstractItemModel允许自定义角色。以下是一些常见的数据角色:
1. **Qt::DisplayRole**:这是最基本的角色,用于显示在视图中的文本。当一个单元格被绘制时,通常会查询这个角色来获取显示的数据。
2. **Qt::EditRole**:当用户尝试编辑单元格时,此角色的数据会被用于设置编辑框的初始值。编辑完成后,新值通常会通过这个角色更新回模型。
3. **Qt::DecorationRole**:用于显示单元格的图标或图像。例如,你可以设置一个勾选标记或颜色图标来表示特定状态。
4. **Qt::ToolTipRole**:当鼠标悬停在单元格上时,显示的工具提示文本。这对于提供额外的信息很有用。
5. **Qt::BackgroundRole** 和 **Qt::ForegroundRole**:分别用于设置单元格的背景色和前景色。这可以用来高亮某些行或列,或者根据数据值改变颜色。
6. **Qt::FontRole**:用于设置单元格内文本的字体。这可以用于强调某些内容或区分不同类型的数据显示。
7. **Qt::CheckStateRole**:用于复选框类型的单元格。如果数据模型支持,可以通过这个角色读取或设置单元格的选中状态。
8. **Qt::UserRole** 及以上:这些角色通常由开发者自定义,用于存储与视图无关但与模型相关的附加信息。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTableView>
#include<QStandardItemModel>
#include<QMenu>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QTableView view;
QStandardItemModel model;
QMenu menu;
QStandardItem itemA;
QStandardItem itemB;
QStandardItem itemC;
QStandardItem itemD;
QStandardItem itemE;
QStandardItem itemF;
bool eventFilter(QObject* obj, QEvent *evt);//事件过滤器
public slots:
void onDelete(void);
};
#endif // WIDGET_H
#include "widget.h"
#include<QEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent),
view(this),
model(this),
menu(this)
{
resize(200,150);//调整窗体大小
//为itemA设置text
itemA.setData("A",Qt::DisplayRole);
//为itemB设置图标
QPixmap pix(":/img/user.png");
pix = pix.scaled(24,24,Qt::KeepAspectRatio);
itemB.setData(pix,Qt::DecorationRole);
//为itemC设置工具提示显示
itemC.setData("C",Qt::ToolTipRole);
//为itemD设置字体属性
QFont font("Times", 10, QFont::Bold);
itemD.setData("D",Qt::DisplayRole);
itemD.setData(font,Qt::FontRole);
//为itemE设置对齐方式
itemE.setData("E",Qt::DisplayRole);
itemE.setData(Qt::AlignHCenter,Qt::TextAlignmentRole);
//为itemF设置渐变背景色
QLinearGradient back(0,0,100,30);
back.setColorAt(0,Qt::white);
back.setColorAt(0.5,Qt::green);
back.setColorAt(1,Qt::blue);
itemF.setData(QBrush(back),Qt::BackgroundRole);
//设置表格的相应数值
model.setItem(0,0, &itemA);
model.setItem(0,1, &itemB);
model.setItem(1,0, &itemC);
model.setItem(1,1, &itemD);
model.setItem(2,0, &itemE);
model.setItem(2,1, &itemF);
model.setItem(3,0, new QStandardItem("G"));
model.setItem(3,1, new QStandardItem("H"));
//设置视图只能选中一行,取消焦点,禁止编辑
view.setFocusPolicy(Qt::NoFocus);//取消焦点
view.setEditTriggers(QAbstractItemView::NoEditTriggers);//设置无法编辑
view.setSelectionMode(QAbstractItemView::SingleSelection);//设置视图只能选择一个项目
view.setSelectionBehavior(QAbstractItemView::SelectRows);//设置视图只能选择行
view.setModel(&model);//视图显示模型
view.installEventFilter(this);//设置事件过滤器
menu.addAction("删除",this,SLOT(onDelete())); //设置菜单项,并连接槽函数
}
void Widget::onDelete(void)
{
model.removeRow(view.currentIndex().row()); //根据当前鼠标所在的索引的行位置,删除一行
}
//设置事件过滤器,实现通过事件过滤器来实现右击菜单效果
bool Widget::eventFilter(QObject* obj, QEvent *evt)
{
if(obj == &view && evt->type() == QEvent::ContextMenu) //被监视的组件为view,要转发的事件是上下文弹出菜单
{
if(view.currentIndex().isValid()==true) //索引有效
{
menu.exec(cursor().pos()); //将菜单menu定位到当前鼠标位置
}
}
return QWidget::eventFilter(obj,evt);//返回事件过滤器
}
Widget::~Widget()
{
}