标题:QListView如何实现点击勾选,再点击取消勾选
作者:lwei24
日期:2023-08-10 09:41
内容:
如题,为了实现QListView每次只能单击一个item,单击item时,右上角显示勾选,再单击后显示不勾选。具体代码如下:
//初始化QListView
m_listView = new QListView(m_widgetPage2);
m_listView->setStyleSheet("...");
m_itemDelegate = new ItemDelegate;
m_listView->setItemDelegate(m_itemDelegate);
m_listView->setSpacing(10);
m_listView->setFlow(QListView::LeftToRight);
m_listView->setViewMode(QListView::ListMode);
m_listView->setDragEnabled(false);
m_listView->setResizeMode(QListView::Adjust);
//m_listView->setSelectionMode(QAbstractItemView::MultiSelection); 如果添加此行代码,item能多选,也能单击单选并单击单选取消
m_listView->setSelectionBehavior(QAbstractItemView::SelectItems);
m_listView->setWrapping(true);
m_listView->setContextMenuPolicy(Qt::NoContextMenu);
m_listView->setCursor(QCursor(Qt::PointingHandCursor)); 当鼠标悬浮在items上时,右上角显示一个圆圈,点击时右上角显示一个勾选,再点击时,右上角取消勾选显示未点击状态。即在代理添加
if(option.state.testFlag(QStyle::State_Selected))
{
//选中时勾选png图标
QPixmap checkImg(":/res/listview/check.png");
painter->drawPixmap(circle.x(), circle.y(), checkImg.width(), checkImg.height(), checkImg);
}
else if(option.state.testFlag(QStyle::State_MouseOver))  ..
#1 [20091001753 08-10 18:07]
当自定义的绘制呈现一定复杂性的时候,例如需要参考其他数据时,你就需要再定义一个类。
例如每个item背后都有一个类实例,储存着相关的数据,你可以把类的指针直接存在item里。
数据例如item是否被选中,也就是在选中或取消时,修改这个指针实例里的类成员就好。
当你需求更复杂时,也可以把部分逻辑放在这个类里,这样可以让代理类专心处理绘制逻辑。
#2 回 20091001753 的帖子 [lwei24 08-11 14:11]
20091001753:
当自定义的绘制呈现一定复杂性的时候,例如需要参考其他数据时,你就需要再定义一个类。
例如每个item背后都有一个类实例,储存着相关的数据,你可以把类的指针直接存在item里。
数据例如item是否被选中,也就是在选中或取消时,修改这个指针实例里的类成员就好。
.......
多谢指点,刚开始,我也是考虑在item的结构体里添加一个是否选中的标志位或常量,但是考虑到可能有多个item,每个item可能有N次点击事件,假如从A点击选中,然后跳到B点击,在代理类里处理判断点击选中或取消选中这两种状态的切换时,尝试处理处理他们的关系,结果效果不是很好。例如代码如下:
if(m_isSelected == true)
{
painter->setPen(QPen(Qt::blue));
painter->setBrush(QColor(229, 241, 255));
painter->drawPath(path);
QPixmap checkImg(":/res/listview/check_1.png");
painter->drawPixmap(circle.x(), circle.y(), checkImg.width(), checkImg.height(), checkImg);
}
else
{
painter->setPen(QPen(Qt ..