效果图
头文件widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class MyDelegate;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void disPlayTableView();
private:
Ui::Widget *ui;
QStandardItemModel* m_modePtr = nullptr;
MyDelegate* itemDelegate = nullptr;
};
class MyDelegate : public QStyledItemDelegate
{
public:
explicit MyDelegate(QObject* parent = nullptr);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
};
#endif // WIDGET_H
cpp文件widget.cpp
#include <QTextOption>
#include <QPainter>
#include "widget.h"
#include "./ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
disPlayTableView();
}
Widget::~Widget()
{
if(m_modePtr != nullptr)
{
delete m_modePtr;
m_modePtr = nullptr;
}
delete ui;
}
void Widget::disPlayTableView()
{
//添加单元格信息
if(m_modePtr == nullptr)
{
m_modePtr = new QStandardItemModel(this);
}
m_modePtr->setItem(0, 0, new QStandardItem("张三"));
m_modePtr->setItem(0, 1, new QStandardItem("3"));
m_modePtr->setItem(0, 2, new QStandardItem("男"));
m_modePtr->setItem(1, 0, new QStandardItem("小青"));
m_modePtr->setItem(1, 1, new QStandardItem("2"));
m_modePtr->setItem(1, 2, new QStandardItem("女"));
//设置delegate
if(itemDelegate == nullptr)
itemDelegate = new MyDelegate(ui->tableView);
ui->tableView->setItemDelegate(itemDelegate);
ui->tableView->setModel(m_modePtr);
}
MyDelegate::MyDelegate(QObject* parent):
QStyledItemDelegate(parent)
{
}
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QTextOption op;
op.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
QFont font;
font.setFamily("Microsoft YaHei");
font.setPixelSize(14);
painter->setFont(font);
// 判断当前是否选中
if(option.state & QStyle::State_Selected)
{
painter->fillRect(option.rect, QBrush(Qt::green));
}
painter->drawText(option.rect, index.data(Qt::DisplayRole).toString(), op);
}