QTableView 设置QCheckbox代理

阅读: 评论:0

QTableView 设置QCheckbox代理

QTableView 设置QCheckbox代理

在QTableView中设置QCheckBox 

头文件:checkboxdelegate.h

#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H#include <QStyledItemDelegate>class CheckBoxDelegate:public QStyledItemDelegate
{Q_OBJECTpublic:CheckBoxDelegate(QObject *parent = nullptr);protected:void paint(QPainter* painter,const QStyleOptionViewItem& option,const QModelIndex& index) const;bool editorEvent(QEvent *event,QAbstractItemModel *model,const QStyleOptionViewItem &option,const QModelIndex &index);
};#endif // CHECKBOXDELEGATE_H

源文件: checkboxdelegate.cpp

#include "checkboxdelegate.h"#include <QApplication>
#include <QMouseEvent>
#include <QPainter>
#include <QStyleOption>
#include <QDebug>static QRect CheckBoxRect(const QStyleOptionViewItem &viewItemStyleOptions)/*const*/
{//绘制按钮所需要的参数QStyleOptionButton checkBoxStyleOption;//按照给定的风格参数 返回元素子区域QRect checkBoxRect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &checkBoxStyleOption);//返回QCheckBox坐标QPoint () + width() / 2 - checkBoxRect.width() / () + height() / 2 - checkBoxRect.height() / 2);//返回QCheckBox几何形状return QRect(checkBoxPoint, checkBoxRect.size());
}CheckBoxDelegate::CheckBoxDelegate(QObject *parent):QStyledItemDelegate(parent)
{}void CheckBoxDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,const QModelIndex& index)const
{bool checked = del()->data(index, Qt::DisplayRole).toBool();lumn() == 11)//重要:设置在第几列显示checkbox{qDebug() << checked;//此处可以设置信号;QStyleOptionButton checkBoxStyleOption;checkBoxStyleOption.state |= QStyle::State_Enabled;checkBoxStyleOption.state |= checked? QStyle::State_On : QStyle::State_ = CheckBoxRect(option);QApplication::style()->drawControl(QStyle::CE_CheckBox,&checkBoxStyleOption,painter);}else{QStyledItemDelegate::paint(painter, option, index);}
}bool CheckBoxDelegate::editorEvent(QEvent *event,QAbstractItemModel *model,const QStyleOptionViewItem &option,const QModelIndex &index)
{lumn() == 11){if((event->type() == QEvent::MouseButtonRelease) ||(event->type() == QEvent::MouseButtonDblClick)){QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);if(mouseEvent->button() != Qt::LeftButton ||!CheckBoxRect(option).contains(mouseEvent->pos())){return true;}if(event->type() == QEvent::MouseButtonDblClick){return true;}}else if(event->type() == QEvent::KeyPress){if(static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space &&static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select){return false;}}else{return false;}bool checked = del()->data(index, Qt::DisplayRole).toBool();return model->setData(index, !checked, Qt::EditRole);}else{return QStyledItemDelegate::editorEvent(event, model, option, index);}
}

使用:

ui->tableView_statictable->setItemDelegate(new CheckBoxDelegate(this));

希望也能帮助到你 ~

本文发布于:2024-02-05 05:28:44,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170725214563447.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:QTableView   QCheckbox
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23