`
qimo601
  • 浏览: 3437215 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

(四)Paint函数实现QTableView中增加QCheckBox的方法

    博客分类:
  • Qt
阅读更多

    第四种方法是:实现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)

相关推荐

    QTableView插入QCheckBox复选框

    本篇将详细介绍如何在QTableView中插入QCheckBox复选框,以及如何实现表头复选框与其他行复选框的关联。 首先,我们需要创建一个自定义的数据模型(QAbstractTableModel或QStandardItemModel)来替代默认的模型。这...

    QTableView添加QCheckBox、QPushButton及右键菜单

    QTableView添加QCheckBox、QPushButton及右键菜单

    qtableview和model配合使用,实现复杂功能

    本篇将详细讲解如何利用QTableView与Model协同工作,实现复杂的功能,如在视图中添加QCheckBox、显示图片以及实现单击事件。 首先,理解QTableView与Model的关系至关重要。QTableView只是一个视图组件,它依赖于一...

    QTableView QCheckBox

    通过以上步骤,我们成功地在`QTableView`中实现了`QCheckBox`的功能,使得用户可以方便地通过复选框操作表格数据。这种技术在很多场合都非常实用,例如在设置多选项、状态标记或进行用户确认操作时。

    QTableView显示自定义CheckBox

    因此,为了在`QTableView`中添加自定义的CheckBox,我们需要创建一个继承自`QStyledItemDelegate`的类,并重写其中的`paint`和`createEditor`方法。 1. **创建自定义Delegate** 首先,我们创建一个新的C++类,例如...

    QTableView中添加各种代码(QSpinBox QconboBox QPushbutton 等)

    - **信号和槽:** 为了响应用户在QTableView中的交互,我们需要连接QSpinBox、QComboBox或QPushButton的信号(如valueChanged、currentIndexChanged或clicked)到相应的槽函数,从而更新模型数据或执行其他操作。...

    qt,QTableView实现复选框,分页功能

    本教程将详细讲解如何在QTableView中实现复选框、分页和查询功能,并涉及与MySQL数据库的交互。 首先,让我们关注在QTableView中添加复选框的功能。这通常通过自定义视图Delegate来实现。你需要创建一个继承自...

    封装QTableView,支持拖拽列,冻结列,自绘表头等操作

    1. **拖拽列**:在QTableView中实现拖拽列功能,主要是通过重载默认的行为并处理`dragMoveEvent`和`dropEvent`等事件来实现的。开发者通常会创建一个QTableView的子类,并通过`setDragDropOverwriteMode`、`...

    基于QT中的QTableView实现表格翻页标签(精准定位、表格可拖动大小、可与滑动条联动)

    本文将深入探讨如何在QTableView中实现表格翻页标签,同时确保表格可以精确定位,支持拖动调整大小,并能与滑动条联动。 首先,我们需要了解QTableView的基本使用。QTableView是一个视图类,它继承自...

    QT在QTableView的一列里添加两个按钮

    在QTableView中添加自定义元素,如按钮,可以实现更丰富的用户交互。 在QT中,要在QTableView的一列中添加两个按钮,我们需要了解以下几个关键知识点: 1. **QTableView**:QTableView是QTableView类的实例,它...

    Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例

    Qt GUI 图形图像开发中,QTableView 是一个非常重要的控件,它可以显示表格数据,实现数据的可视化展示。下面将详细介绍 QTableView 的使用方法与实例。 一、QTableView 简介 QTableView 是 Qt 中的一个表格视图...

    QTableView添加复选框,下拉框控件

    在Qt框架中,QTableView是用于显示表格数据的视图组件,它允许用户查看和编辑由模型提供的数据。在特定的开发场景中,我们可能需要增强QTableView的功能,例如为表格中的每一行添加复选框或者下拉框控件,以提供更多...

    QTableview实现委托、翻页、搜索功能

    在这个主题中,我们将深入探讨如何利用QTableView实现委托(Delegation)、分页(Pagination)以及搜索(Search)功能。 **一、QTableView委托(Delegation)** 委托是Qt中一种强大的机制,允许我们自定义视图项的...

    QTableView 切换折叠展开图标

    3. **重写paint方法**:在自定义委托中,我们需要覆盖`paint`方法,根据当前项的状态绘制展开/折叠图标。这可以通过检查模型中的数据来决定。 4. **信号和槽**:当用户点击图标时,需要触发一个信号,使得视图可以...

    Qtablewidget和Qtableview实现手指滑动

    用在嵌入式QT或者安卓QT,判断手指滑动方向,来实现手指滑动浏览,并显示自定义滑动条,滑动条可以支持上色,包含两个QtableWidget和QtableView示例,都可以用,文章链接:https://www.cnblogs.com/lifexy/p/14111572.html

    QTableView插入各种按钮

    在某些情况下,我们可能需要在QTableView的单元格中插入各种类型的按钮,以实现更丰富的功能,例如执行特定操作或者导航到其他界面。本篇文章将深入探讨如何在QTableView中插入不同类型的按钮,以增强用户界面的交互...

    qt qtableview在表头中添加combobox,checkbox,spinbox

    在Qt编程中,QTableView是用于显示表格数据的控件,而QHeaderView则是QTableView的一部分,用于展示列头或行头。本主题聚焦于如何在QTableView的表头(QHeaderView)中添加更丰富的交互元素,如Combobox(下拉框)、...

    MVC_QTableView_Model_Delegate.rar

    在本文中,我们将深入探讨如何使用QT框架中的关键组件,如`QTableView`、`QAbstractTableModel`和`QStyledItemDelegate`,以及如何在这些组件中集成`QCheckBox`和可点击按钮,来实现一个功能丰富的MVC(模型-视图-...

    qtableview 自定义委托 checkbox,进度条、时间等控件

    要实现这一点,我们需要创建一个继承自QStyledItemDelegate的类,然后在`paint()`方法中绘制复选框,并在`editorEvent()`中处理用户的点击事件,以更新模型数据。 2. **进度条(Progress Bar)**:对于需要展示进度...

    Pyqt5 QTableWidget/QTableView 行表头添加复选框全选功能

    本篇文章将详细探讨如何在`QTableWidget`或`QTableView`的表头中添加复选框,并实现全选/全不选的功能。 首先,我们需要了解`QTableWidgetItem`和`QHeaderView`。`QTableWidgetItem`是`QTableWidget`中的基本元素,...

Global site tag (gtag.js) - Google Analytics