先上张效果图
就不贴完整代码了,只把具体的实现代码给弄上来,相信一看就那啥:
//设置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);
}
再用到时,大手一挥复制粘贴完事~~~~~