QTableView QAbstractTableModel QStyledItemDelegate QHeaderView 定制化表格(一)

一、效果图
在这里插入图片描述
二、工程构造思路
利用MVC视图模型,QTableView 定义视图对象,QAbstractTableModel 构造数据组织方式,QStyledItemDelegate 实现表格数据样式代理,QHeaderView 实现表头数据样式代理。
三、代码片段

#include "tablewidget.h"
#include "ui_tablewidget.h"
#include <QAbstractItemView>

tableWidget::tableWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::tableWidget)
{
    ui->setupUi(this);

    tableview *view = new tableview(this);
    tablemodel *model = new tablemodel(this);
    tabledelegate *delegate = new tabledelegate(this);
    headdelegate *hdelegate = new headdelegate(Qt::Horizontal,view);

    view->setModel(model);
    view->setItemDelegate(delegate);
    view->setHorizontalHeader(hdelegate);
    view->setFocusPolicy(Qt::NoFocus);
    ui->horizontalLayout->addWidget(view);
    view->verticalHeader()->hide();
    view->horizontalHeader()->setHighlightSections(false);
    view->horizontalHeader()->setSectionsClickable(false);
    view->setSelectionBehavior(QAbstractItemView::SelectRows);
    view->setContextMenuPolicy(Qt::CustomContextMenu);
    view->setAlternatingRowColors(true);

    view->setStyleSheet("QTableView::indicator {width: 14px; height: 14px; padding-left:6px;}"                        
                        "QTableView::item{background-color:#ffffff;color:#666666;padding-left:8px;}"
                        "QTableView::item:selected{background-color:#EBF3FF;color:#666666;}"
                        "QTableView{border-right-width:0px;border-top-width:1px;border-style:solid;border-color:#eeeeee;gridline-color:#eeeeee;background-color:white;font-family: MicrosoftYaHei;font-size: 12px;}"
                        );

    view->verticalScrollBar()->setStyleSheet("QScrollBar:vertical{background:transparent;width:12px;border-radius:0px;border-width:1px;border-style:solid;border-color:#eeeeee;}"
                                             "QScrollBar::handle:vertical{width:1px;background:#cccccc;border-radius:3px;min-height:60px;}"
                                             "QScrollBar::sub-line:vertical {background:transparent;}"
                                             "QScrollBar::add-line:vertical {background:transparent;}");

}

tableWidget::~tableWidget()
{
    delete ui;
}



#include "tablemodel.h"
tablemodel::tablemodel(QObject *par)
{
    for(int i=0;i<17;i++){
        QStringList list;
        for(int j=0;j<5;j++){
            list.append(QString::number(i));
        }
        m_vlist.append(list);
    }
}

tablemodel::~tablemodel()
{

}

int tablemodel::rowCount(const QModelIndex &parent) const
{
    return  m_vlist.size();
}

int tablemodel::columnCount(const QModelIndex &parent) const
{
    return m_vlist.value(0).size();
}

bool tablemodel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(!index.isValid())
        return false;
    return  QAbstractTableModel::setData(index,value,role);
}

QVariant tablemodel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();

    if(Qt::TextAlignmentRole == role)
        return QVariant(Qt::AlignLeft | Qt::AlignVCenter);

    if(Qt::DisplayRole == role){
        return m_vlist.value(index.row()).value(index.column());
    }
    return QVariant();
}

QVariant tablemodel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(orientation == Qt::Horizontal)
    {
        switch(role)
        {
        case Qt::TextAlignmentRole:
            return QVariant(Qt::AlignLeft | Qt::AlignVCenter);

        case Qt::DisplayRole:
            return QString("标题")+QString::number(section);
        default:
            return QVariant();
        }
    }
    return QAbstractTableModel::headerData(section,orientation,role);
}


#include "tabledelegate.h"
tabledelegate::tabledelegate(QObject *parent)
{
}
void tabledelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    //去掉Focus
    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);
}
bool tabledelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    return false;
}


#include "headdelegate.h"
headdelegate::headdelegate(Qt::Orientation orientation, QWidget *parent)
    : QHeaderView(orientation, parent)
{
    this->setStyleSheet("QHeaderView{border-width:0px;background-color:#F8F8F8;color:#333333;font-family: MicrosoftYaHei;font-size: 12px;}"
                        "QHeaderView::section:first{border-left:1px;border-right:1px;border-style:solid;border-color:#eeeeee;height:37px;padding-left:10px;background-color:#F8F8F8;}"
                        "QHeaderView::section:middle{border-left:0px;border-right:1px;border-style:solid;border-color:#eeeeee;height:37px;padding-left:10px;background-color:#F8F8F8;}"
                        "QHeaderView::section:last{border-left:0px;border-right:1px;border-style:solid;border-color:#eeeeee;height:37px;padding-left:10px;background-color:#F8F8F8;}");
}

void headdelegate::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
    QHeaderView::paintSection(painter, rect, logicalIndex);
}

欢迎各方多多指教
QQ:519096571
e-mail:[email protected]

发布了30 篇原创文章 · 获赞 1 · 访问量 1166

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/102844149
今日推荐