qt QTableView中添加一个多选按钮,这个多选安装可以点击

1.概要

2.代码

在Qt中,如果你想在QTableView的单元格中添加一个多选按钮(例如QCheckBox),并且能够响应点击事件,你需要进行以下几个步骤:

  1. 创建一个自定义的委托(Delegate):这个委托将负责在单元格中绘制和编辑QCheckBox
  2. 在你的模型(Model)中处理数据:确保你的模型能够存储和提供QCheckBox的状态。
  3. 将委托设置到QTableView:使得QTableView知道在特定单元格中使用这个委托。

下面是一个简单的示例,演示如何实现这一点:

1. 创建一个自定义委托

首先,创建一个继承自QStyledItemDelegate的类,并重写其paintcreateEditorsetEditorDatasetModelData方法。

#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QCheckBox>
#include <QPainter>

class CheckBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    CheckBoxDelegate(QObject *parent = nullptr)
        : QStyledItemDelegate(parent)
    {}

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        QStyleOptionButton checkBoxStyle;
        checkBoxStyle.state = QStyle::State_Enabled | QStyle::State_NoChange;

        if (index.data(Qt::CheckStateRole).toBool())
        {
            checkBoxStyle.state |= QStyle::State_On;
        }
        else
        {
            checkBoxStyle.state |= QStyle::State_Off;
        }

        checkBoxStyle.rect = option.rect;

        QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxStyle, painter);
    }

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override
    {
        QCheckBox *editor = new QCheckBox(parent);
        return editor;
    }

    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
        checkBox->setChecked(index.data(Qt::CheckStateRole).toBool());
    }

    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
    {
        QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
        model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
    }
};

#endif // CHECKBOXDELEGATE_H

2. 在你的模型中处理数据

确保你的模型(例如QStandardItemModel或自定义的QAbstractTableModel)能够存储和返回Qt::CheckStateRole的数据。

QStandardItemModel *model = new QStandardItemModel(4, 2);
for (int row = 0; row < 4; ++row)
    for (int column = 0; column < 2; ++column)
        model->setItem(row, column, new QStandardItem());

// Set some initial check states
model->setData(model->index(0, 0), Qt::Checked, Qt::CheckStateRole);
model->setData(model->index(1, 0), Qt::Unchecked, Qt::CheckStateRole);

3. 将委托设置到QTableView

QStandardItemModel *model = new QStandardItemModel(4, 2);
for (int row = 0; row < 4; ++row)
    for (int column = 0; column < 2; ++column)
        model->setItem(row, column, new QStandardItem());

// Set some initial check states
model->setData(model->index(0, 0), Qt::Checked, Qt::CheckStateRole);
model->setData(model->index(1, 0), Qt::Unchecked, Qt::CheckStateRole);

完整示例

#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QCheckBox>
#include <QPainter>

class CheckBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    CheckBoxDelegate(QObject *parent = nullptr)
        : QStyledItemDelegate(parent)
    {}

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        QStyleOptionButton checkBoxStyle;
        checkBoxStyle.state = QStyle::State_Enabled | QStyle::State_NoChange;

        if (index.data(Qt::CheckStateRole).toBool())
        {
            checkBoxStyle.state |= QStyle::State_On;
        }
        else
        {
            checkBoxStyle.state |= QStyle::State_Off;
        }

        checkBoxStyle.rect = option.rect;

        QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxStyle, painter);
    }

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override
    {
        QCheckBox *editor = new QCheckBox(parent);
        return editor;
    }

    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
        checkBox->setChecked(index.data(Qt::CheckStateRole).toBool());
    }

    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
    {
        QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
        model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
    }
};

#endif // CHECKBOXDELEGATE_H
#include "CheckBoxDelegate.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTableView *tableView = new QTableView;
    QStandardItemModel *model = new QStandardItemModel(4, 2);
    for (int row = 0; row < 4; ++row)
        for (int column = 0; column < 2; ++column)
            model->setItem(row, column, new QStandardItem());

    model->setData(model->index(0, 0), Qt::Checked, Qt::CheckStateRole);
    model->setData(model->index(1, 0), Qt::Unchecked, Qt::CheckStateRole);

    tableView->setModel(model);

    CheckBoxDelegate *delegate = new CheckBoxDelegate(tableView);
    tableView->setItemDelegateForColumn(0, delegate);

    tableView->show();
    return app.exec();
}

 

这个示例展示了如何在QTableView中添加一个可以点击的多选按钮,并通过自定义委托来处理绘制和编辑操作。

3.运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值