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

有如下代码

cpp 复制代码
#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) 这个方法,当遇到 双击事件时,单独处理即可。代码如下

cpp 复制代码
#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);
    }
}

修正后效果如图

相关推荐
xll_00711 分钟前
使用Python设置excel单元格的字体(font值)
开发语言·python·excel
芦屋花绘16 分钟前
Java的JUC详细全解
java·开发语言·jvm·spring boot·kafka
我最厉害。,。24 分钟前
-PHP 反序列化&POP 链构造&魔术方法流程&漏洞触发条件&属性修改
开发语言·php
海棠蚀omo28 分钟前
C++笔记-stack_queue(含deque,priority_queue,仿函数的讲解)
开发语言·c++·笔记
lfwh31 分钟前
Java 实现单链表翻转(附详细注释)
java·开发语言·python
元亓亓亓1 小时前
java后端开发day35--集合进阶(四)--双列集合:Map&HashMap&TreeMap
java·开发语言
全栈老李技术面试2 小时前
【高频考点精讲】JavaScript中的访问者模式:从AST解析到数据转换的艺术
开发语言·前端·javascript·面试·html·访问者模式
广龙宇2 小时前
【一起学Rust】使用Thunk工具链实现Rust应用对Windows XP/7的兼容性适配实战
开发语言·windows·rust
jerry2011082 小时前
R语言之rjava版本不匹配解决方法
开发语言·r语言
拓端研究室TRL2 小时前
PYTHON用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据
开发语言·python