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);
}

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

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: QTableViewQt中的一个控件,用于显示表格数据。而自定义Model则是指用户可以自己编写一个继承自QAbstractTableModel的类,来实现自己的数据模型。这样,用户就可以通过自定义Model来控制QTableView中显示的数据,包括数据的格式、排序、过滤等等。自定义Model是Qt中非常常见的一种技术,可以帮助用户更好地管理和展示数据。 ### 回答2: QTableViewQt中用于展示表格数据的控件,在实际应用中经常需要自定义QTableView的数据模型,以满足业务需求。自定义QTableView的数据模型分为两种,一种是基于QAbstractTableModel的数据模型,另一种是基于QStandardItemModel的数据模型。 使用QAbstractTableModel自定义QTableView的模型,需要继承该类并实现以下虚函数:rowCount()、columnCount()、headerData()和data()。其余函数可根据实际需求决定是否实现,或者使用父类的默认实现。在实现完成后,需要在QTableView设置该模型,通过setModel()函数进行设置。 使用QStandardItemModel自定义QTableView的模型,需要生成一定数量的QStandardItem作为数据单元,使用setItem()函数将数据单元插入到表格中,再通过setHorizontalHeaderLabels()和setVerticalHeaderLabels()设置行列头。在实现完成后,需要在QTableView设置该模型,通过setModel()函数进行设置自定义QTableView的模型可进行以下操作:插入或删除数据、修改数据、添加或删除列、排序等。实现这些操作需要在自定义数据模型中添加相应的函数,同时需要在QTableView中建立信号与槽的连接,以使模型与视图之间保持相互响应。例如,添加一行数据可使用insertRow()函数实现,删除一行数据可使用removeRow()函数实现,修改单元格数据可使用setData()函数实现,添加一列数据可使用insertColumn()函数实现,删除一列数据可使用removeColumn()函数实现。 总体来说,自定义QTableView的模型可以提高表格数据的可读性和可操作性,满足不同需求的表格数据展示。 ### 回答3: QTableViewQt中常用的控件之一,它用于展示表格数据。QTableView可以通过使用自定义的model来实现对表格数据的更加灵活的操作。 自定义model是指重写QAbstractTableModel的子类,以实现控制table view中数据的行为。重要的是实现rowCount、columnCount、data、headerData函数。函数的重写规则与父类相同,rowCount和columnCount分别返回表格的行数和列数,data返回表格中指定位置的数据,headerData则返回表格中每列的标题。 接下来,我们可以利用自定义model来实现对表格的排序、编辑、删除等操作。 排序操作可以通过重写自定义model的sort函数来实现。sort函数接受一个column index和排序类型作为参数,然后在model内部对数据进行排序并重新发射数据变更信号通知QTableView更新。 编辑操作可以通过重写自定义model的setData函数来实现。setData接受row index、column index、新的数据作为参数,并在model内部更新数据,并重新发射数据变更信号通知QTableView更新。 删除操作也可以通过重写自定义model的removeRows函数来实现。removeRows接受row index、count作为参数,并在model内部删除相应行的数据,并重新发射数据变更信号通知QTableView更新。 总之,自定义model为QTableView提供了一个可扩展的表格数据界面,通过实现自定义model,我们可以更好地控制、管理和操作表格中的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值