QT中级(3)QTableView自定义委托(三)实现QCheckBox委托并且将QCheckBox居中

这篇具有很好参考价值的文章主要介绍了QT中级(3)QTableView自定义委托(三)实现QCheckBox委托并且将QCheckBox居中。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 写在前面的话

我们在之前写的《QT(7)-初识委托》文章末尾提到,“使用一个类继承QStyledItemDelegate实现常用的控件委托,在使用时可以直接调用接口,灵活实现各种委托”。我们接下来几篇文章将先详细讲解各个控件的委托,最后整理成一个类,并分享源码。如果大家感兴趣,可以点个关注,后面我们一起学习!

讲解比较详细,大家可以跟着一步一步做,自己就可以实现了。

2 需要用到的部分知识

《QT(3)-QTableView》
《QT(4)-QAbstractItemView》
《QT(6)-QStandardItemModel》
《QT(7)-初识委托》

3 同系列文章

QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托
QT中级(2)QTableView自定义委托(二)实现QProgressBar委托

4 实现QCheckBox委托

在QTableView中实现QCheckBox委托并居中显示,需要以下步骤:

  1. 创建一个自定义的委托类,继承自QStyledItemDelegate。
  2. 重写该委托类的paint函数,实现QCheckBox的居中显示。
  3. 重写该委托类的editorEvent函数,实现QCheckBox的状态改变。
  4. 为QTableView的相应单元格设置该委托类。
  5. 在数据模型中处理QCheckBox状态的更改,以便在重绘时正确显示。

4.1 第一步

和前几篇文章一样,我们需要建立一个项目,并且需要我们拖拽QTableView,以及对其初始化。我们在这里就不在赘述,大家可以参考前面几篇文章是如何创建的。

4.2 第二步

  1. 创建Delegate类,方法和前面几篇文章一样
  2. 需要我们先定义三函数
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override;

这三个函数的含义前面几篇文章都已经提到了,不再赘述。

4.3 第三步

  1. 实现paint函数
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

    if(index.column() == 2)
    {
        bool value = index.data(Qt::UserRole).toInt();
        QStyleOptionButton checkBoxOption;
        QRect checkBoxRect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkBoxOption);
        checkBoxOption.rect = option.rect;
        checkBoxOption.rect.setLeft(option.rect.left() + (option.rect.width() - checkBoxRect.width()) / 2);
        checkBoxOption.rect.setTop(option.rect.top() + (option.rect.height() - checkBoxRect.height()) / 2);
        checkBoxOption.state = value ? QStyle::State_On :QStyle::State_Off;
        checkBoxOption.state |= QStyle::State_Enabled;
        QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxOption, painter);
    }//if
    else
    {
        QStyledItemDelegate::paint(painter,option,index);
    }
}
  1. 实现editorEvent函数
bool Delegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    if(event->type() == QEvent::MouseButtonDblClick)//禁止双击编辑
        return true;
    //过滤鼠标松开
    if (event->type() == QEvent::MouseButtonRelease) {
        return false;
    }

    bool checked = index.data(Qt::UserRole).toBool();
    model->setData(index, !checked, Qt::UserRole);

    return QStyledItemDelegate::editorEvent(event,model,option,index);
}

4.4 最后一步

我们需要在mainwindow.cpp中的init()调用delegate类实现委托。我们将QTableView的第一列设置为委托:

更新mainwindow.cpp中的init()函数

void MainWindow::init()
{
    QStringList columnNames;
    columnNames<<"QSpinBox"<<"QComboBox"<<"QCheckBox"<<"QProgressBar"<<"···";

    model = new QStandardItemModel;
    model->setRowCount(10);
    model->setHorizontalHeaderLabels(columnNames);
    ui->tableView->setModel(model);

    Delegate *checkDelegate = new Delegate;
    ui->tableView->setItemDelegateForColumn(2,checkDelegate);
}

4.5 效果图

QT中级(3)QTableView自定义委托(三)实现QCheckBox委托并且将QCheckBox居中

5 源码

源码文章来源地址https://www.toymoban.com/news/detail-490994.html

到了这里,关于QT中级(3)QTableView自定义委托(三)实现QCheckBox委托并且将QCheckBox居中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt QTableView 实现数据改变表格自动刷新

    这里提供一份简单的代码示例,实现QTableView实时刷新数据: 在代码中,我们首先创建一个QStandardItemModel数据模型,并设置表格的行数和列数,同时设置表头和填充数据。然后将数据模型绑定到QTableView中,并实现数据变化自动刷新的功能。最后显示QWidget窗口。 在实际开发中

    2024年02月13日
    浏览(33)
  • Qt QCheckBox复选按钮控件

    Qt中的复选按钮类是 QCheckBox 它和单选按钮很相似,单选按钮常用在“多选一”的场景,而复选按钮常用在\\\"多选多\\\"的场景 比如喜欢的水果选项中,可以在“苹果/桃/梨/橘子/香蕉”中选择多个。 QRadioButton 有很多属性,完整的可查看帮助文档。这里列出常用的属性和方法。 这

    2024年02月01日
    浏览(31)
  • 基于Qt数据库项目实现(Sqlite3为例)|考查数据库、表格(QTableView 显示)(进阶)

    01 数据库表格(QTableView 显示) 本小节设计一个生活中的例子,使用数据库修改/查询员工的编号、姓名、年龄、性别与照片信息。 本例将数据库的内容显示到 QTableView 上。如果只是简单的显示数据库的内容到QTableView 上,可以使用下面的方法,此方法 QTableView 上可以看到

    2024年02月20日
    浏览(34)
  • Qt创建右键菜单的两种通用方法(QTableView实现右键菜单,含源码+注释)

    下图为两种右键菜单实现的示例图,源码在本文第三节(源码含详细注释)。 提示:不会使用Qt设计师设计界面的小伙伴点击这里。 该方法是触发contextMenuEvent事件来实现右键菜单,只需在该事件函数中写入对应的右键菜单代码即可。 该方法是通过控件发出的customContextMenuR

    2024年02月15日
    浏览(33)
  • 【VS Code 与 Qt6】QCheckBox的图标为什么不会切换?

    本篇专门扯一下有关 QCheckBox 组件的一个问题。老周不水字数,直接上程序,你看了就明白。 QCheckBox、QRadioButton、QPushButton 都是 QAbstractButton 的子类,所以这几个家伙都归属于按钮组件。在 QAbstractButton 类中已定义有 checkable 属性,表示按钮是否支持 check 操作。这种按钮就类似

    2024年02月07日
    浏览(31)
  • 【QT 基础教程 十四】QTableView类解析

    头文件:#includeQTableView 模块:QT += widgets 父类:QAbstractItemView 功能:Qt中的QTableView可以将数据项显示在表格视图中 1.初始化 2.绑定模型 3.添加内容显示 视图是模型的界面显示 ,所以在视图显示内容,需要让模型拿到数据。 4.隐藏行 5.设置行高、列宽 6.获取选中行 7.返回当前

    2024年03月20日
    浏览(54)
  • uniapp实现自定义导航内容高度居中(兼容APP端以及小程序端与胶囊对齐)

    ①效果图如下 1.小程序端与胶囊对齐 2.APP端内容区域居中     注意:上面使用的是colorui里面的自定义导航样式。 ②思路: 1.APP端和小程序端走不同的方法,因为小程序端要计算不同屏幕下右侧胶囊的高度。 2.其次最重要的要清晰App端和小程序端的计算逻辑。 3.然后调用api获

    2024年02月13日
    浏览(41)
  • QT中QTableView对单个单元格操作的方法

    此处举例对单元格操作的读取和写入

    2024年02月16日
    浏览(30)
  • QTableWidget 实现添加 QCheckBox

    一、 添加复选框QCheckBox初始化默认状态,效果图 主要代码: 二、 添加两个复选框QCheckBox的互斥功能,同时只能有一个选中 效果图 主要代码: 互斥代码: 数据选中判断

    2024年02月13日
    浏览(50)
  • Qt QtableWidget、QtableView表格删除选中行、删除单行、删除多行

    设置 操作 设置 操作 无需设置 setSelectionBehavior(QAbstractItemView::SelectRows) ,但是可以选择的那一列最好设置为不可编辑。按下Ctrl键,选择多行。 设置1 设置2 操作 QTableWidgetSelectionRange是Qt框架中用于表示QTableWidget中选定的一块单元格区域的类。以下是如何使用QTableWidgetSelectionR

    2024年02月01日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包