qt中tableview怎么添加checkbox

 我来答
life郎才女貌
2017-10-30 · 超过30用户采纳过TA的回答
知道答主
回答量:95
采纳率:0%
帮助的人:34.1万
展开全部
编辑委托

利用委托中重载createEditor(),激活QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。
设置QAbstractTableModel的flags()函数,通过重写setData()与data()来实现。
使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。

此功能只应该用来显示可视区域内对应一个数据项的静态内容。如果想显示自定义的动态内容或执行自定义编辑器部件,子类化
QItemDelegate代替。也就是说,这只适合做静态数据的显示,不适合做一些插入、更新、删除操作的数据显示。
自定义委托,通过paint()方法来实现。这种方式比较复杂,但适合扩展,除了可以嵌入复选框,还可以通过绘制其它控件,按钮、图片等自定义风格。
下面就介绍最常用的方式,即方法二。
QMap用来保存选中行号以及对应的选中状态
QMap check_state_map;

setData()方法主要用来设置是否被选中,然后将对应的状态保存到QMap中
bool TableModel::setData( const QModelIndex &index, const QVariant &value, int role )
{
if(!index.isValid())
return false;

if (role == Qt::CheckStateRole && index.column() == 0)
{
check_state_map[index.row()] = (value == Qt::Checked ? Qt::Checked : Qt::Unchecked);
}

return true;
}

data()方法主要用来显示,取出QMap中的值,返回对应的状态
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

switch(role)
{
//case Qt::TextAlignmentRole:
// return Qt::AlignLeft | Qt::AlignVCenter;

//case Qt::DisplayRole:
// return arr_row_list->at(index.row()).at(index.column());

case Qt::CheckStateRole:
if(index.column() == 0)
{
if (check_state_map.contains(index.row()))
return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;

return Qt::Unchecked;
}
default:
return QVariant();
}

return QVariant();
}

flag()方法主要设置用户可选角色,绘制出QCheckBox
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;

if (index.column() == 0)
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;

return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式