QTableView的自定义样式和代理

先上张效果图

就不贴完整代码了,只把具体的实现代码给弄上来,相信一看就那啥:

//设置QTableView表头高度和大小时,必须设置section的first,middle,last和设置字体颜色,不然设置大小不生效
    QString strStyle = R"(
        QHeaderView::section:first,
        QHeaderView::section:last,
        QHeaderView::section:middle
        {
            font:28pt "微软雅黑";
        }
        QHeaderView::section{
            font:28pt "微软雅黑";
            color: rgb(255, 255, 255);
            background-color: rgb(33, 119, 220);
            height: 70px;
            border: none;
        }
        QHeaderView{
            border-top-left-radius:8px;
            border-top-right-radius:8px;
        }
        QTableView{
            background-color: white;
            border: 2px solid rgb(33, 119, 220);
            gridline-color: transparent;
            border-radius:8px;
            alternate-background-color: rgb(200,238,255);
            selection-background-color: transparent;
            color: black;
            font: 30pt "微软雅黑";
        }
        QTableView::item:selected,
        QTableView::item:selected:!active,
        QTableView::text{
            color: black;
            background-color: transparent;
            border: none;
        }
    )";
    ui->tableView->setStyleSheet(strStyle);

    mModel = new QStandardItemModel();
    mModel->setColumnCount(4);
    mModel->setHeaderData(0,Qt::Horizontal,"序号");
    mModel->setHeaderData(1,Qt::Horizontal,"文件编号");
    mModel->setHeaderData(2,Qt::Horizontal,"文件描述");
    mModel->setHeaderData(3,Qt::Horizontal,"选择");

    //最后一列用
    PicCheckBox* pDelegate = new PicCheckBox;
    connect(pDelegate, &PicCheckBox::signalClicked, this, [=](const QModelIndex& index){
        bool bVal = mModel->data(index).toBool();
        mModel->setData(index, !bVal);
    });
    ui->tableView->setItemDelegateForColumn(3,pDelegate);
    ui->tableView->setModel(mModel);

    mModel->setRowCount(20);
    for(int i=0;i<20;i++)
    {
        QStandardItem* item = new QStandardItem(QString("%1").arg(i+1));
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); //设置居中
        mModel->setItem(i,0, item);

        item = new QStandardItem("b123456789");
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        mModel->setItem(i,1, item);

        item = new QStandardItem("谁动了我的奶酪");
        item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        mModel->setItem(i,2, item);
    }
    for(int i=0;i<20;i++)
        ui->tableView->setRowHeight(i,110);

    ui->tableView->setColumnWidth(0,180);
    ui->tableView->setColumnWidth(1,450);
    ui->tableView->setColumnWidth(2,930);
    ui->tableView->setColumnWidth(3,150);

    ui->tableView->verticalHeader()->hide();
    ui->tableView->horizontalHeader()->setStretchLastSection(true); //最后一列充满表格
    ui->tableView->setShowGrid(false); //隐藏网格
    ui->tableView->setAlternatingRowColors(true);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView->horizontalHeader()->setHighlightSections(false);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    //不使用滚动条,使可拖拽下拉
    QScroller* sroller = QScroller::scroller(ui->tableView);
    sroller->grabGesture(ui->tableView, QScroller::LeftMouseButtonGesture);
    QScrollerProperties properties = sroller->scrollerProperties();
    properties.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0);
    properties.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, 0);
    sroller->setScrollerProperties(properties);

接下来是CheckBox代理代码

/*头文件*/
#ifndef CHECKBOXITEMDELEGATE_H
#define CHECKBOXITEMDELEGATE_H

#include <QObject>
#include <QCheckBox>
#include <QItemDelegate>

class PicCheckBox : public QItemDelegate
{
    Q_OBJECT
public:
    explicit PicCheckBox(QWidget *parent = nullptr);

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
signals:
    void signalClicked(const QModelIndex &index);
};

#endif // CHECKBOXITEMDELEGATE_H








/*cpp*/
#include "piccheckbox.h"

#include <QPainter>
#include <QEvent>
#include <QMouseEvent>

PicCheckBox::PicCheckBox(QWidget *parent):
    QItemDelegate(parent)
{
}

void PicCheckBox::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    bool bChecked = index.data().toBool();
    QPixmap pixmap;
    QRect rect = option.rect;
    QPoint pt = rect.center();
    if(bChecked)
        pixmap = QPixmap(":/images/checked-icon.png").scaled(32,32);
    else
        pixmap = QPixmap(":/images/unchecked-icon.png").scaled(32,32);

    pt -= QPoint(pixmap.width()/2,pixmap.height()/2);
    painter->drawPixmap(pt, pixmap);
}

bool PicCheckBox::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    QRect rect = option.rect;
    if(event->type() == QEvent::MouseButtonRelease)
    {
        QMouseEvent * ev = static_cast<QMouseEvent*>(event);
        if (rect.contains(ev->x(), ev->y()))
            emit signalClicked(index);
    }
    return QItemDelegate::editorEvent(event, model, option, index);
}

再用到时,大手一挥复制粘贴完事~~~~~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JL_MG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值