QTableView 例三(代理)

22 篇文章 2 订阅

1、 QComboBox 代理

#pragma once
#include <QStyledItemDelegate>
class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    MyDelegate(QObject *parent = 0);
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const override;
    void setEditorData(QWidget *editor, const QModelIndex &index) const override;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const override;
    void updateEditorGeometry(QWidget *editor,
        const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
#include "delegate.h"
#include <QSpinBox>
#include <QComboBox>
MyDelegate::MyDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{
}
QWidget *MyDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex & index ) const
{
    if(index.column() == 6) //在第六列
    {
        QComboBox* box = new QComboBox(parent);
        box->addItems(QStringList()<<"优"<<"良"<<"差");
        return box;
    }
    return NULL;
}
void MyDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();
    QComboBox* box = static_cast<QComboBox*>(editor);
    box->setCurrentText(value);
}
void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QComboBox* box = static_cast<QComboBox*>(editor);
    model->setData(index, box->currentText(), Qt::EditRole);
}
void MyDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect);
}

2、QCheckBox代理

#ifndef CHECKDELEGATE_H
#define CHECKDELEGATE_H
#include <QStyledItemDelegate>
class CheckDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    CheckDelegate(QObject *parent = 0);
    const QStyleOptionViewItem &option, const QModelIndex &index) const override;
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // CHECKDELEGATE_H
#include "checkdelegate.h"
#include <QSpinBox>
#include <QComboBox>
#include <QCheckBox>
#include <QApplication>
#include <QMouseEvent>
#include <QRadioButton>

CheckDelegate::CheckDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{
}
bool CheckDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    QRect decorationRect = option.rect;
    QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
    if (event->type() == QEvent::MouseButtonPress && decorationRect.contains(mouseEvent->pos()))
    {
        if (index.column() == 7)
        {
            bool data = model->data(index, Qt::UserRole).toBool();
            model->setData(index, !data, Qt::UserRole);
        }
    }
    return QStyledItemDelegate::editorEvent(event, model, option, index);
}
void CheckDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem viewOption(option);
    initStyleOption(&viewOption, index);
    if (option.state.testFlag(QStyle::State_HasFocus))
        viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
    QStyledItemDelegate::paint(painter, viewOption, index);
    if (index.column() == 7)
    {
        bool data = index.model()->data(index, Qt::UserRole).toBool();
        QStyleOptionButton checkBoxStyle;
        checkBoxStyle.state = data ? QStyle::State_On : QStyle::State_Off;
        checkBoxStyle.state |= QStyle::State_Enabled;
        checkBoxStyle.iconSize = QSize(20, 20);
        checkBoxStyle.rect = option.rect;
        QCheckBox checkBox;
        QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter, &checkBox);
    }
}

3、 使用代理

#include <QApplication>
#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QThread>
#include "delegate.h"
#include "checkdelegate.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    /* 创建表格视图 */
    QTableView *tableView = new QTableView;

    /* 设置表格视图大小 */
    tableView->resize(850, 400);

    /* 创建数据模型 */
    QStandardItemModel* model = new QStandardItemModel();

    /* 设置表格标题行(输入数据为QStringList类型) */
    model->setHorizontalHeaderLabels({"ID", "User Name", "City", "Classify", "Score", "Text","Level","Check"});
    /* 自适应所有列,让它布满空间 */
    tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    MyDelegate* delegate = new MyDelegate;
    tableView->setItemDelegateForColumn(6,delegate);
    CheckDelegate* c = new CheckDelegate;
    tableView->setItemDelegateForColumn(7,c);
    /* 加载共10行数据,并每行有6列数据 */
    for (int i = 0; i < 10; i++) {
        /* 加载第一列(ID)数据 */
        model->setItem(i, 0, new QStandardItem(QString("100%1").arg(i)));
        /* 加载第二列(User Name)数据 */
        model->setItem(i, 1, new QStandardItem(QString("User%1").arg(i)));
        /* 加载第三列(City)数据 */
        model->setItem(i, 2, new QStandardItem("Shanghai"));
        /* 加载第四列(Classify)数据 */
        model->setItem(i, 3, new QStandardItem("Engineer"));
        /* 加载第五列(Score)数据 */
        model->setItem(i, 4, new QStandardItem("80"));
        /* 加载第六列(Sign)数据 */
        model->setItem(i, 5, new QStandardItem("Hello world!"));
        model->setItem(i, 6, new QStandardItem(""));
        QStandardItem *item =  new QStandardItem;
        item->setData(false,1);
        model->setItem(i, 7,item );
    }
    /* 设置表格视图数据 */
    tableView->setModel(model);
    /* 显示 */
    tableView->show();
    return a.exec();
}

4、 效果

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt中使用QTableView添加复选框可以通过自定义委托实现。首先,我们需要创建一个自定义的委托类来设置单元格的编辑控件为复选框。 ```cpp class CheckBoxDelegate : public QItemDelegate { public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QStyleOptionButton checkboxStyle; checkboxStyle.state |= QStyle::State_Enabled | QStyle::State_Active; if (index.data(Qt::CheckStateRole).toBool()) checkboxStyle.state |= QStyle::State_On; else checkboxStyle.state |= QStyle::State_Off; checkboxStyle.rect = option.rect.adjusted(0, 0, -1, -1); QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkboxStyle, painter); } QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QCheckBox *editor = new QCheckBox(parent); editor->setAttribute(Qt::WA_TransparentForMouseEvents); editor->setChecked(index.data(Qt::CheckStateRole).toBool()); connect(editor, SIGNAL(clicked(bool)), this, SLOT(commitAndCloseEditor())); 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); } void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override { editor->setGeometry(option.rect); } private slots: void commitAndCloseEditor() { QCheckBox *editor = static_cast<QCheckBox*>(sender()); emit commitData(editor); emit closeEditor(editor); } }; ``` 接下来,在创建QTableView并设置model之后,我们可以为需要添加复选框的列设置自定义委托。 ```cpp QTableView tableView; QStandardItemModel model(10, 3); // 例如,创建一个10行3列的模型 tableView.setModel(&model); CheckBoxDelegate delegate; tableView.setItemDelegateForColumn(2, &delegate); // 为第3列设置自定义委托 ``` 通过这样的方式,我们可以在QTableView中的指定列上显示复选框,并实现相应的操作。 ### 回答2: Qt的TableView通过使用QCheckBox作为模型元素来添加复选框。可以通过实现自定义的委托类来启用这个功能。 首先,需要创建一个新的委托类,继承QItemDelegate。在这个委托类中,重写createEditor()和setEditorData()方法,并使用QCheckBox作为编辑器。 以下是一个示例: ```cpp #include <QtWidgets> class CheckBoxDelegate : public QItemDelegate { public: CheckBoxDelegate(QObject *parent = nullptr) : QItemDelegate(parent) { } QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override { Q_UNUSED(option) Q_UNUSED(index) QCheckBox *editor = new QCheckBox(parent); return editor; } void setEditorData(QWidget *editor, const QModelIndex &index) const override { QCheckBox *checkBox = qobject_cast<QCheckBox*>(editor); if (checkBox) { bool checked = index.model()->data(index, Qt::DisplayRole).toBool(); checkBox->setChecked(checked); } } void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override { QCheckBox *checkBox = qobject_cast<QCheckBox*>(editor); if (checkBox) { model->setData(index, checkBox->isChecked(), Qt::EditRole); } } }; ``` 接下来,在TableView中使用这个自定义委托类。例如: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); QStandardItemModel model(4, 2); QTableView tableView; CheckBoxDelegate checkBoxDelegate; tableView.setItemDelegateForColumn(0, &checkBoxDelegate); tableView.setModel(&model); tableView.show(); return app.exec(); } ``` 这样,TableView的第一列将显示复选框。您可以通过在模型中设置数据来更改复选框的状态,例如: ```cpp QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setData(Qt::Unchecked, Qt::CheckStateRole); model->setItem(row, 0, item); ``` 这样,当您运行应用程序时,您应该能够在TableView中看到具有复选框的行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值