当前位置: 首页 > ds >正文

[Qt]双击事件导致的问题

有如下代码

#include "mymodel.h"
#include <QDebug>myModel::myModel(QObject *parent) : QAbstractTableModel(parent)
{status << Qt::Unchecked << Qt::Unchecked << Qt::Unchecked;
}int myModel::rowCount(const QModelIndex &parent)const
{Q_UNUSED(parent);return 3;
}int myModel::columnCount(const QModelIndex &parent)const
{Q_UNUSED(parent);return 2;
}void myModel::setHeader(const QStringList &list)
{m_header = list;
}QVariant myModel::headerData(int section, Qt::Orientation orientation, int role) const
{if(role == Qt::DisplayRole){if(orientation == Qt::Horizontal){return m_header.at(section);}}return QVariant();
}QVariant myModel::data(const QModelIndex &index, int role)const
{if(role == Qt::DisplayRole){if(index.column() == 0){return QStringLiteral("%1号同学").arg(index.row() + 1);}if(index.column() == 1){return QStringLiteral("1000%1").arg(index.row() + 1);}}if(role == Qt::CheckStateRole){if(index.column() == 0){return status.at(index.row());}return QVariant();}return QVariant();
}Qt::ItemFlags myModel::flags(const QModelIndex &index) const
{if(!index.isValid()){return QAbstractItemModel::flags(index);}Qt::ItemFlags flags = QAbstractItemModel::flags(index);if(index.column() == 0){flags |= Qt::ItemIsUserCheckable;}return flags;
}bool myModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if(!index.isValid()){return false;}if(role == Qt::CheckStateRole){if(index.column() == 0){status[index.row()] = value.toInt();emit dataChanged(index, index);return true;}}return false;
}

效果如下
在这里插入图片描述
额,效果不是很明显。但是当我快速点击鼠标左键时,发现checkbox的状态并没有立即修改,这是因为快速点击鼠标左键时,被识别成了双击事件,修改思路如下,创建一个类继承于QStyledItemDelegate,然后重写 bool QStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) 这个方法,当遇到 双击事件时,单独处理即可。代码如下

#include "MyStyledItemDelegate.h"
#include <QEvent>MyStyledItemDelegate::MyStyledItemDelegate(QObject *parent) : QStyledItemDelegate(parent)
{}bool MyStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{if(event->type() == QEvent::MouseButtonDblClick && index.column() == 0){model->setData(index, index.data(Qt::CheckStateRole).toInt() == Qt::Checked ? Qt::Unchecked : Qt::Checked ,Qt::CheckStateRole);return true;}else{return QStyledItemDelegate::editorEvent(event, model, option, index);}
}

修正后效果如图
在这里插入图片描述

http://www.xdnf.cn/news/812.html

相关文章:

  • Kafka 如何理解Kafka的高可用
  • AI对话高效输入指令攻略(三):使用大忌——“AI味”
  • IDEA打不开、打开报错
  • idea远程debug调试
  • eBay自动化定价陷阱调查:价格战背后的利润黑洞与破局之道
  • redis队列 和 秒杀应用
  • 音视频学习(三十五):aud
  • 什么是AI智能音视频?小天互连即时通讯带您体验
  • ECharts散点图-散点图13,附视频讲解与代码下载
  • 多级缓存架构,让系统更快的跑起来!
  • P5670 秘籍-反复异或 Solution
  • 微软Edge浏览器字体设置
  • Matlab自学笔记五十一:(推荐)输入参数的数量和可变数量的输入
  • 前端笔记-JavaScript(下)
  • Python多进程同步全解析:从竞争条件到锁、信号量的实战应用
  • 基于javaweb的SpringBoot爱心捐赠平台系统设计与实现(源码+文档+部署讲解)
  • 免费图片软件,可矫正倾斜、调整去底效果
  • Deepseek生成图片,支持手机和PC
  • 【KWDB 创作者计划】_上位机知识篇---Arduino
  • Sharding-JDBC 系列专题 - 第二篇:广播表(Broadcast Tables)
  • docker常用命令
  • C语言究竟是一门怎样的语言
  • PyCharm使用Anaconda 中的虚拟环境
  • firewall指令
  • 存储图表数据的模板类QCPDataContainer
  • Vue.js核心功能实现
  • 线性DP:最长上升子序列(子序列可不连续,子数组必须连续)
  • vuex实现同一页面radio-group点击不同按钮显示不同表单
  • nrf52840 16通道adc+DMA采集电压 C语言代码
  • Linux系统编程---孤儿进程与僵尸进程