我想在QTableView
中实现一个使用QAbstractModel创建的用户可编辑复选框。我可以分配已选中和未选中的复选框但无法使其可编辑。
flag设置为QItemIsUserCheckable
。
答案 0 :(得分:14)
您可以通过实现这样的模型setData()
方法轻松完成:
bool yourModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false;
if (role == Qt::CheckStateRole)
{
if ((Qt::CheckState)value.toInt() == Qt::Checked)
{
//user has checked item
return true;
}
else
{
//user has unchecked item
return true;
}
}
return false;
}
不要忘记你的模型的data()
方法:
QVariant ProxyModelSubobjects::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::CheckStateRole && index.column() == COLUMN_WITH_CHECKBOX)
{
//return Qt::Checked or Qt::Unchecked here
}
//...
}
答案 1 :(得分:3)
首先要做的事情。
只有在创建树模型时,QAbstractItemModel才是模型的理想选择,而在大多数情况下,最好使用QAbstractTableModel甚至QAbstractListModel,因为它们可以为您节省实现虚拟方法的工作对于特定的模型类型(表或列表)。
这些模型的文档非常详尽,并告诉您要为模型实现哪些功能可编辑。对于这个简短的解释,我将使用表格模型。 主要功能是:
我将忽略其他人。
所有Qt视图都以相同的方式工作 - 当它们被显示时,它们用模型中的数据填充它们,它们的元素是可编辑的/可选择的等等,根据flags()为它们的索引返回的值。编辑它们时,该值将通过setData()函数传递给模型。
你似乎缺少的是flags()方法中的Qt :: ItemIsEditable标志。
答案 2 :(得分:1)
您要实现的是自定义委托。有关实际实现的更多信息,请查看QAbstractItemDelegat类。
答案 3 :(得分:0)
在我经历了一堆论坛试图弄清楚如何做到这一点并且没有任何效果后,我最终找到了一张纸条 http://doc.qt.io/qt-4.8/modelview.html
在2.2扩展带有角色的只读示例时,文本注释 “现在我们需要确定使用分离模型如何影响应用程序的性能,所以让我们跟踪视图调用data()方法的频率。为了跟踪视图调用模型的频率,我们在其中放置了一个调试语句。 data()方法,它登录到错误输出流。在我们的小例子中,data()将被调用42次。每次将光标悬停在字段上时,data()将再次被调用 - 每个单元格调用7次这就是为什么在调用data()并缓存昂贵的查找操作时确保数据可用是很重要的。“
这使我意识到“yourModal :: data()”被连续调用,但是,为了额外的更新,我在设置中添加了一个时间来运行检查选择。我有点棘手,因为我实际上是从我的MainWindow打开一个groupBox弹出窗口,享受额外的代码。
所以基本上这是我提出的代码,它运行得很好:
{{1}}