无法检查 QListView 的项目
Cannot check item of QListView
我正在研究一个带有QListView
和继承QAbstractListModel
的自定义模型的对话框类。我列表中的项目是带有多个标签的自定义小部件。
我设法通过重新实现模型的data()
、setData()
和flags()
方法为每个项目显示一个复选框,但是当我运行代码并单击与其中一个项目关联的复选框时,复选框没有显示为选中(保持未选中状态(。
这是我的代码:
我的模型.h
class MyModel : public QAbstractListModel
{
Q_OBJECT
public:
MyModel(QObject *parent);
int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE ;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
Qt::ItemFlags flags(const QModelIndex & index) const Q_DECL_OVERRIDE ;
QSet<QPersistentModelIndex> checkedItems;
};
我的模型.cpp
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if(role == Qt::CheckStateRole)
{
if(checkedItems.contains(index))
return Qt::Checked;
else
return Qt::Unchecked;
}
return QVariant();
}
bool MyModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
if(role == Qt::CheckStateRole)
{
if(value == Qt::Checked)
checkedItems.insert(index);
else
checkedItems.remove(index);
emit dataChanged(index, index);
}
return true;
}
Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
return QAbstractListModel::flags(index) | Qt::ItemIsUserCheckable;
}
我的代表
class MyDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
MyDelegate(QObject* parent = 0) : QStyledItemDelegate(parent) {}
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
我的代表.cpp
QSize MyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
return QSize(400, 120);
}
在 mydialog 的构造函数中.cpp
model = new MyModel(this);
ui->list->setModel(model);
ui->list->setItemDelegate(new MyDelegate(this));
我尝试添加标志Qt::ItemIsEnabled
和Qt::ItemIsEditable
但它没有改变任何东西。
到目前为止,我对视图/模型实现不是很熟悉,尽管我已经阅读了Qt文档。
谢谢你的帮助!
更准确地说,这是我的想法
bool MyModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
if(role == Qt::CheckStateRole)
{
if(value == Qt::Checked)
checkedItems.insert(index);
self.checkBoxList[index.row()][index.column()].setChecked(True)
else
checkedItems.remove(index);
self.checkBoxList[index.row()][index.column()].setChecked(False)
emit dataChanged(index, index);
}
return true;
}
我只是没有你所有的代码,所以我不知道你的self.checkBoxList是如何完成的。复选框是表的子项吗?
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 更新 QTreeView 和 QListView 中的项目
- 无法检查 QListView 的项目
- 如何使用QListView项目添加复选框
- 从QListView项目中隐藏复选框
- Qt-检测QListView中的项目信息更改
- 将 Qlistview 限制为最多 1 个选定项目
- QListView:当从顶部删除项目时,如何自动滚动视图并保持视图中正确项目的当前选择
- 如何从QListView中获取所选项目
- 如何在选择多个项目时清除QListView的选择
- Qt5 C++:从QListView的模型中删除项目以及如何计算项目
- 从QStringListModel作为模型的QListview中删除单个项目
- 滚动QListView以在列表开始插入时保持项目在视图中
- QListView具有复选框选择行为的项目
- QListView项目背景颜色