- 浏览: 3437215 次
- 性别:
- 来自: 苏州
-
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
第四种方法是:实现QAbstractItemDelegate的paint()函数。
这种方法和《C++_GUI_Qt4_编程(第二版)》中第十章的自定义委托例子,画星星的作法是一样的,都是通过 QApplication::style()->drawControl(QStyle::CE_CheckBox,&check_box_style_option,painter);这个函数,只不过选择的元素是QCheckBox的。
使用Delegate Paint()函数 具体如下:
void QLineDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,const QModelIndex& index)const { bool checked = index.model()->data(index, Qt::DisplayRole).toBool(); if(index.column() == 0) { QStyleOptionButton check_box_style_option; check_box_style_option.state |= QStyle::State_Enabled; if(checked) { check_box_style_option.state |= QStyle::State_On; } else { check_box_style_option.state |= QStyle::State_Off; } check_box_style_option.rect = CheckBoxRect(option); QApplication::style()->drawControl(QStyle::CE_CheckBox,&check_box_style_option,painter); } QStyledItemDelegate::paint(painter,option,index); QStyleOptionViewItem itemOption(option); if(itemOption.state & QStyle::State_HasFocus) itemOption.state = itemOption.state ^ QStyle::State_HasFocus; QStyledItemDelegate::paint(painter,itemOption,index); QPen oldPen = painter->pen(); painter->setPen(pen); painter->drawLine(option.rect.topRight(),option.rect.bottomRight()); painter->drawLine(itemOption.rect.bottomLeft(),itemOption.rect.bottomRight()); painter->setPen(oldPen); }
完整的源代码如下:
class QLineDelegate : public QStyledItemDelegate { Q_OBJECT public: QLineDelegate(QTableView* tableView); protected: void paint(QPainter* painter,const QStyleOptionViewItem& option,const QModelIndex& index) const; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) ; private: QPen pen; QTableView* view; }; static QRect CheckBoxRect(const QStyleOptionViewItem &view_item_style_options) { QStyleOptionButton check_box_style_option; QRect check_box_rect = QApplication::style()->subElementRect( QStyle::SE_CheckBoxIndicator, &check_box_style_option); QPoint check_box_point(view_item_style_options.rect.x() + view_item_style_options.rect.width() / 2 - check_box_rect.width() / 2, view_item_style_options.rect.y() + view_item_style_options.rect.height() / 2 - check_box_rect.height() / 2); return QRect(check_box_point, check_box_rect.size()); } QLineDelegate::QLineDelegate(QTableView* tableView) { int gridHint = tableView->style()->styleHint(QStyle::SH_Table_GridLineColor, new QStyleOptionViewItemV4()); QColor gridColor = static_cast<QRgb>(gridHint); pen = QPen(gridColor,0,tableView->gridStyle()); view = tableView; } void QLineDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,const QModelIndex& index)const { bool checked = index.model()->data(index, Qt::DisplayRole).toBool(); if(index.column() == 0) { QStyleOptionButton check_box_style_option; check_box_style_option.state |= QStyle::State_Enabled; if(checked) { check_box_style_option.state |= QStyle::State_On; } else { check_box_style_option.state |= QStyle::State_Off; } check_box_style_option.rect = CheckBoxRect(option); QApplication::style()->drawControl(QStyle::CE_CheckBox,&check_box_style_option,painter); } QStyledItemDelegate::paint(painter,option,index); QStyleOptionViewItem itemOption(option); if(itemOption.state & QStyle::State_HasFocus) itemOption.state = itemOption.state ^ QStyle::State_HasFocus; QStyledItemDelegate::paint(painter,itemOption,index); QPen oldPen = painter->pen(); painter->setPen(pen); painter->drawLine(option.rect.topRight(),option.rect.bottomRight()); painter->drawLine(itemOption.rect.bottomLeft(),itemOption.rect.bottomRight()); painter->setPen(oldPen); } bool QLineDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if((event->type() == QEvent::MouseButtonRelease) || (event->type() == QEvent::MouseButtonDblClick)) { QMouseEvent *mouse_event = static_cast<QMouseEvent*>(event); if(mouse_event->button() != Qt::LeftButton || !CheckBoxRect(option).contains(mouse_event->pos())) { return false; } 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 = index.model()->data(index, Qt::DisplayRole).toBool(); return model->setData(index, !checked, Qt::EditRole); }
不过有一个小问题,CheckBox旁边有false/true或其它字符的原因是:你的Model中的data返回值,应该排除这列。
转:http://www.cppblog.com/gaimor/archive/2011/11/26/160993.html
【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结
评论
1 楼
愚人陈
2014-03-18
谢谢~
-------------
setIndexWidget 的话,
此cell 的view 原来 的clicked(QModelIndex) 事件 就不能 正常触发了,
我现在 用的 方法 是 派生 QPushButton, 给 按钮 添加 id, 和 自定义 clicked(id) 事件,
来 区分和处理 不同 indexWidget 产生的 事件.
-------------
请问,博主 有没有 什么 直接的 方法 能够 让view原来 的 clicked(QModelIndex) 正常触发?
-------------
这个 貌似 和 QTableWidget->setCellWidget 一样的, 同样不能 触发 clicked(QModelIndex)
-------------
setIndexWidget 的话,
此cell 的view 原来 的clicked(QModelIndex) 事件 就不能 正常触发了,
我现在 用的 方法 是 派生 QPushButton, 给 按钮 添加 id, 和 自定义 clicked(id) 事件,
来 区分和处理 不同 indexWidget 产生的 事件.
-------------
请问,博主 有没有 什么 直接的 方法 能够 让view原来 的 clicked(QModelIndex) 正常触发?
-------------
这个 貌似 和 QTableWidget->setCellWidget 一样的, 同样不能 触发 clicked(QModelIndex)
发表评论
-
Qt官网变更【2012】
2012-09-21 19:30 4195Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力 ... -
【转】QT实现不规则窗体
2012-09-21 18:50 4949看到好文章,收藏一下: 看到网上有很多不规则窗体的实现 ... -
Qt应用程序如何使用DCMTK类库进行二次开发DICOM数据传输
2012-09-13 09:35 0参考文章: 1、Using DCMTK with ... -
【转】将QT开发的界面程序封装成DLL,在VC中成功调用
2012-09-11 10:33 21095最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后 ... -
诺基亚挥别Qt,转手给Digia
2012-09-11 09:37 2850一家总部位于芬兰的IT业务供应商Digia今天宣布,已经签署了 ... -
Qt多线程间信号槽传递非QObject类型对象的参数
2012-09-07 15:29 21322一、以前就发现过这个问题: 在Qt项目中,有时候为了 ... -
QT样式表(QStyleSheet)
2012-08-17 10:37 17864QT样式表 (QStyleSheet) 作者:刘旭晖 ... -
FinalData磁盘文件恢复工具(绿色破解版)
2012-08-02 13:28 8560FinalData磁盘文件恢复工具(绿色破解版),使用起来很方 ... -
Eclipse Qt开发环境的建立【转】
2012-08-01 11:15 43551.下载Eclipse目前Eclipse+CDT已经可以 ... -
汽车辐射监测系统-Qt开发
2012-07-25 16:18 4678最近晚上抽空忙了两个月,才把一个小系统做完。虽然做的不是太完 ... -
Qt做发布版,解决声音和图片、中文字体乱码问题
2012-07-14 16:02 4849Qt做发布版,解决声音和图片、中文字体乱码问题 ... -
QTableView使用中的疑问,如何及时显示操作Model后的结果?
2012-06-01 14:52 0最终的解决方法:我正 ... -
【转】Qt QTableview使用
2012-06-01 09:49 9663QTableWidget是QT程序中常用的显示数 ... -
QTableView双击 单机事件信号
2012-06-01 09:47 23015双击QTableView的行,获取该行数据 代码 ... -
QMessageBox改变大小
2012-05-31 15:33 8416创建一个QMessageBox: QMessageBo ... -
更新QTableView中的进度条状态
2012-05-30 14:37 14805前段时间,我接触了,如何在一个QTableView中加入一个控 ... -
QThread 线程暂停 停止功能的实现
2012-05-29 11:56 12177为了实现Qt中线程的暂停运行,和停止运行的控制功能 需要在设 ... -
QT环境变量
2012-05-28 18:53 5578不知道为啥同事有台电脑,装完Qt-VS2008库,和VS Ad ... -
广告光
2012-05-24 18:33 0盈创广告联盟 http://www.yo114.cn/ ... -
Test
2012-05-24 18:22 2172Test<IMG SRC="cf08e32c2 ...
相关推荐
本篇将详细介绍如何在QTableView中插入QCheckBox复选框,以及如何实现表头复选框与其他行复选框的关联。 首先,我们需要创建一个自定义的数据模型(QAbstractTableModel或QStandardItemModel)来替代默认的模型。这...
QTableView添加QCheckBox、QPushButton及右键菜单
本篇将详细讲解如何利用QTableView与Model协同工作,实现复杂的功能,如在视图中添加QCheckBox、显示图片以及实现单击事件。 首先,理解QTableView与Model的关系至关重要。QTableView只是一个视图组件,它依赖于一...
通过以上步骤,我们成功地在`QTableView`中实现了`QCheckBox`的功能,使得用户可以方便地通过复选框操作表格数据。这种技术在很多场合都非常实用,例如在设置多选项、状态标记或进行用户确认操作时。
因此,为了在`QTableView`中添加自定义的CheckBox,我们需要创建一个继承自`QStyledItemDelegate`的类,并重写其中的`paint`和`createEditor`方法。 1. **创建自定义Delegate** 首先,我们创建一个新的C++类,例如...
- **信号和槽:** 为了响应用户在QTableView中的交互,我们需要连接QSpinBox、QComboBox或QPushButton的信号(如valueChanged、currentIndexChanged或clicked)到相应的槽函数,从而更新模型数据或执行其他操作。...
本教程将详细讲解如何在QTableView中实现复选框、分页和查询功能,并涉及与MySQL数据库的交互。 首先,让我们关注在QTableView中添加复选框的功能。这通常通过自定义视图Delegate来实现。你需要创建一个继承自...
1. **拖拽列**:在QTableView中实现拖拽列功能,主要是通过重载默认的行为并处理`dragMoveEvent`和`dropEvent`等事件来实现的。开发者通常会创建一个QTableView的子类,并通过`setDragDropOverwriteMode`、`...
本文将深入探讨如何在QTableView中实现表格翻页标签,同时确保表格可以精确定位,支持拖动调整大小,并能与滑动条联动。 首先,我们需要了解QTableView的基本使用。QTableView是一个视图类,它继承自...
在QTableView中添加自定义元素,如按钮,可以实现更丰富的用户交互。 在QT中,要在QTableView的一列中添加两个按钮,我们需要了解以下几个关键知识点: 1. **QTableView**:QTableView是QTableView类的实例,它...
Qt GUI 图形图像开发中,QTableView 是一个非常重要的控件,它可以显示表格数据,实现数据的可视化展示。下面将详细介绍 QTableView 的使用方法与实例。 一、QTableView 简介 QTableView 是 Qt 中的一个表格视图...
在Qt框架中,QTableView是用于显示表格数据的视图组件,它允许用户查看和编辑由模型提供的数据。在特定的开发场景中,我们可能需要增强QTableView的功能,例如为表格中的每一行添加复选框或者下拉框控件,以提供更多...
在这个主题中,我们将深入探讨如何利用QTableView实现委托(Delegation)、分页(Pagination)以及搜索(Search)功能。 **一、QTableView委托(Delegation)** 委托是Qt中一种强大的机制,允许我们自定义视图项的...
3. **重写paint方法**:在自定义委托中,我们需要覆盖`paint`方法,根据当前项的状态绘制展开/折叠图标。这可以通过检查模型中的数据来决定。 4. **信号和槽**:当用户点击图标时,需要触发一个信号,使得视图可以...
用在嵌入式QT或者安卓QT,判断手指滑动方向,来实现手指滑动浏览,并显示自定义滑动条,滑动条可以支持上色,包含两个QtableWidget和QtableView示例,都可以用,文章链接:https://www.cnblogs.com/lifexy/p/14111572.html
在某些情况下,我们可能需要在QTableView的单元格中插入各种类型的按钮,以实现更丰富的功能,例如执行特定操作或者导航到其他界面。本篇文章将深入探讨如何在QTableView中插入不同类型的按钮,以增强用户界面的交互...
在Qt编程中,QTableView是用于显示表格数据的控件,而QHeaderView则是QTableView的一部分,用于展示列头或行头。本主题聚焦于如何在QTableView的表头(QHeaderView)中添加更丰富的交互元素,如Combobox(下拉框)、...
在本文中,我们将深入探讨如何使用QT框架中的关键组件,如`QTableView`、`QAbstractTableModel`和`QStyledItemDelegate`,以及如何在这些组件中集成`QCheckBox`和可点击按钮,来实现一个功能丰富的MVC(模型-视图-...
要实现这一点,我们需要创建一个继承自QStyledItemDelegate的类,然后在`paint()`方法中绘制复选框,并在`editorEvent()`中处理用户的点击事件,以更新模型数据。 2. **进度条(Progress Bar)**:对于需要展示进度...
本篇文章将详细探讨如何在`QTableWidget`或`QTableView`的表头中添加复选框,并实现全选/全不选的功能。 首先,我们需要了解`QTableWidgetItem`和`QHeaderView`。`QTableWidgetItem`是`QTableWidget`中的基本元素,...