QTableView QCheckBox

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

m晴朗

https://blog.csdn.net/qq_40666149/article/details/128889536

QT中级(3)QTableView自定义委托(三)实现QCheckBox委托并且将QCheckBox居中_实现在qtableview中委托实现qcheckbox-CSDN博客

已于 2023-11-01 14:52:43 修改

阅读量2.3k
 收藏 20

点赞数 3
分类专栏: QT中级 文章标签: qt ui QT自定义委托 QTableView
版权

QT自定义委托集合(一个类实现11种常用委托,包含源代码和demo)

讲解文章:https://blog.csdn.net/qq_40666149/article/details/128924599 1. 一个类实现11种常用委托,使用灵活,可以直接将代码加入到自己的项目中,零耦合。 2. 复选框控件:可以居中,可以在点击的时候发送信号,在外部轻松获得数据。 3. 图标控件:可以指定某一种条件(<、>、=灯),指定某一行为判断行,当某个行的值符合条件时,会先一种图标,不符合时显示另一种图标 4.密码框控件:可以显示明文和密码文,密码样式可以自己指定,同时当数值改变时,会发送信号 5. 数值控件/日期时间控件/进度条控件:在前面4篇文章中已经有教程了 6. 下拉框控件:可以一直显示在视图上,也可以点击时才显示 7. 按钮控件:可以根据关键词创建不同个数的按钮,且每个按钮都有独立的信号 已经在win和Ubuntu上测试可以正常运行 8. 本demo里面包含我们创建委托类的全部用法。

立即下载

QT中级
专栏收录该内容
11 篇文章10 订阅
订阅专栏
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委托并居中显示,需要以下步骤:

创建一个自定义的委托类,继承自QStyledItemDelegate。
重写该委托类的paint函数,实现QCheckBox的居中显示。
重写该委托类的editorEvent函数,实现QCheckBox的状态改变。
为QTableView的相应单元格设置该委托类。
在数据模型中处理QCheckBox状态的更改,以便在重绘时正确显示。
4.1 第一步
和前几篇文章一样,我们需要建立一个项目,并且需要我们拖拽QTableView,以及对其初始化。我们在这里就不在赘述,大家可以参考前面几篇文章是如何创建的。

4.2 第二步
创建Delegate类,方法和前面几篇文章一样
需要我们先定义三函数
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;
1
2
3
这三个函数的含义前面几篇文章都已经提到了,不再赘述。

4.3 第三步
实现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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
实现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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
4.5 效果图


5 源码
源码
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_40666149/article/details/128889536

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QTableView 是一个显示表格数据的控件,它提供了一种在界面上展示数据的方式,可以方便地查看和编辑表格数据。 QCheckBox 是一个单选框控件,它提供了一种选择或取消选择某个选项的方式。当需要用户在多个选项中进行单选操作时,可以使用 QCheckBox 控件来增加用户的交互体验。 在使用 QTableView 和 QCheckBox 控件时,可以将 QCheckBox 添加到 QTableView 的某一列中的每一个单元格中,用来标识该行数据是否被选中。这样就可以实现在表格中选择或取消选择某些特定的行数据。 当用户点击某个 QCheckBox 控件时,可以通过信号和槽机制来捕捉到 QCheckBox 被选中或取消选中的事件,然后根据事件来改变 QTableView 中相应行数据的状态。 除此之外,还可以通过通过编程的方式操作 QCheckBox 控件,例如通过代码设置某一行的 QCheckBox 控件为选中状态或取消选中状态,或者获取某一行 QCheckBox 控件的状态来进行相关的处理。 总之,使用 QTableView 和 QCheckBox 控件可以方便地对表格数据进行展示和选择操作,提供了一种方便和快捷的方式来处理表格数据。 ### 回答2: QTableView是一个表格视图,它是Qt中数据展示的一种常用方式。它可以显示一张表格,其中包含了行和列的数据。 QCheckbox是一个复选框,它是Qt中常用的一种控件。它可以同时显示未选中和选中两种状态,并且可以通过用户的操作来切换状态。 当我们将这两个控件结合使用时,可以实现一些有趣的功能。 例如,我们可以在QTableView中的某一列中插入QCheckbox,这样每一行都会有一个复选框。用户可以通过勾选或取消勾选这些复选框来选择其中的某些行。 此外,我们还可以编写代码来实现全选或全不选的功能。比如,当用户点击一个全选的复选框时,所有的行的复选框都会变为选中状态,当用户取消勾选全选的复选框时,所有的行的复选框都会变为未选中状态。 我们还可以在QTableView中使用QCheckbox来控制一些与数据相关的操作。比如,当用户勾选某个复选框时,可以执行某个特定的操作,比如删除该行的数据。 综上所述,QTableView和QCheckbox是两个常用的Qt控件,结合使用可以实现很多有用的功能。在开发Qt应用程序时,我们可以根据具体需求来使用它们,提供更好的用户体验。 ### 回答3: QTableView和QCheckBoxQt框架中常用的两个控件。 QTableView是一个表格视图控件,用于显示二维数据。通过QTableView,可以将数据以表格的形式展示出来,并支持对数据进行排序、筛选、编辑等操作。QTableView可以根据需要自定义表头、行数、列数、单元格内容和格式等。同时,还可以通过设置不同的选择模式,实现单选、多选或无选择的功能。 QCheckBox则是一个复选框控件,用于表示二选一或多选一的状态。通过QCheckBox,用户可以在多个选项中进行选择,并可以通过勾选或取消勾选的方式改变其状态。QCheckBox可以设置默认状态、选中状态、禁用状态等,并且可以通过信号和槽机制,实现对状态变化的响应。 在使用QTableView时,可以将QCheckBox作为一个自定义的编辑控件嵌入到表格中的某一列,用于表示某个特定的列为复选框的选择状态。例如,在一个任务列表中,可以将某一列设为复选框,用于选择是否完成相应的任务。这样,用户可以通过对复选框进行勾选或取消勾选的操作来改变任务的完成状态。 总而言之,QTableView和QCheckBoxQt框架中十分有用的两个控件。通过QTableView,可以轻松地展示和处理二维数据,而QCheckBox则为用户提供了一种方便的选择和控制状态的方式。它们的结合使用,可以帮助我们开发出更加灵活和交互性的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值