如何在QAbstractItemModel中设置QCheckBox
how set QCheckBox in QAbstractItemModel?
我有一个模型
class TreeModel : public QAbstractItemModel
我用CCD_ 1的实例填充,不包括列==1。在第1列中,我创建了CheckBoxes
:
QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole) {
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
if (index.row() == 1) {
return Qt::Unchecked;
} else
return Qt::Checked;
}
}
return QVariant();
}
if (role == Qt::DisplayRole) {
if (index.column() != 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
}
return QVariant();
}
我可以将这些复选框状态设置为Qt::Checked
或Qt::Unchecked
,但我的问题是:以后单击它们时,我无法更改它们(但是setData
是用适当的index.column==1
和role==Qt::CheckStateRole
调用的)。我看到过ItemDelegate
的例子——只有这一点似乎有效。这是真的吗?在这种情况下,我必须使用委托吗?
这是我的setData()
函数:
bool TreeModel::setData(const QModelIndex & index, const QVariant & value,
int role) {
if (role==Qt::CheckStateRole && index.column() == 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
QTreeWidgetItem *check = static_cast<QTreeWidgetItem*>(index.internalPointer());
//if (item->data(index.column()) == Qt::Checked)
if (value == Qt::Checked){
int i=1;
//check->setCheckState(1,Qt::Checked); //SIGSEGV
}else{
//(item->data(index.column())) = Qt::Unchecked;
int i=2;
//check->setCheckState(1,Qt::Unchecked);
}
emit dataChanged(index, index);
return true;
}
emit dataChanged(index, index);
return true;;
}
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const {
if (!index.isValid())
return 0;
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
}
我不理解Qt的概念。您必须在TreeItem
0(存储检查状态)中设置数据,然后在data()
中填充模型,并为复选框返回这个新值,类似于:
setData()
bool TreeModel::setData(const QModelIndex & index, const QVariant & value, int role) {
if (role == Qt::CheckStateRole && index.column() == 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
QTreeWidgetItem *check = static_cast<QTreeWidgetItem*>(index.internalPointer());
if (value == Qt::Checked) {
checkedState_ = Qt::Checked;
}
else {
checkedState_ = Qt::Unchecked;
}
}
emit dataChanged(index, index);
return true;
}
data()
QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
return checkedState_;
}
}
else if (role == Qt::DisplayRole) {
if (index.column() != 1) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
}
return QVariant();
}
我觉得很奇怪,你总是为数据(CheckStateRole)返回相同的结果
if (role == Qt::CheckStateRole) {
if (index.column() == 1) {
if (index.row() == 1) {
return Qt::Unchecked;
} else
return Qt::Checked;
}
}
未选中(1,1),并选中(与1,1不同)
正在调用setData(),但是当视图查询模型中的值时,您在data()中总是返回相同的值
在没有任何ItemDelegate
的情况下,在flags
方法中必须返回标志:Qt::ItemIsUserCheckable
。
有关更多信息,请参阅:http://qt-project.org/doc/qt-4.8/qt.html#ItemFlag-枚举
使用@Trompa和@tinky_winky的示例,我成功地创建了这个工作示例,正如@Trompa建议的那样,我们需要返回一个不同的值,或者存储这个值并在我们的数据()中检索它,以获得该特定索引的实际状态。
QVector<int> status;
int SData::getStatus(int pos)
{
return status.at(pos);
}
void SData::setStatus(int pos,int value)
{
status.insert(pos, value);
}
QVariant STableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole)
return rowList[index.row()][index.column()];
else if (role == Qt::CheckStateRole && index.column() == 0)
{
int status = SData::instance().getStatus(index.row());
if (status)
return Qt::Checked;
else
return Qt::Unchecked;
}
else
return QVariant();
}
bool STableModel::setData(const QModelIndex &index,
const QVariant &value, int role)
{
if (!index.isValid() /*|| role != Qt::EditRole*/)
return false;
if (role == Qt::CheckStateRole)
{
if ((Qt::CheckState)value.toInt() == Qt::Checked)
{
SData::instance().setStatus(index.row(),1);
return true;
}
else
{
SData::instance().setStatus(index.row(), 0);
return true;
}
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 如何在QAbstractItemModel中设置QCheckBox