QTableView自定义左上角CornerWidget

一、效果图

图中高亮部分即为CornerWidget
在这里插入图片描述

二、头文件及实现

#include <QHeaderView>
#include <QTableView>
#include <QStandardItemModel>

class CustomerStandardModel : public QStandardItemModel{
    Q_OBJECT
public:
    explicit CustomerStandardModel(QObject* parent = nullptr);
    CustomerStandardModel(int rows, int columns, QObject *parent = Q_NULLPTR);
    ~CustomerStandardModel(){

    }
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
};

class QPushButton;
class CustomerPrivacyTableVeiw : public QTableView
{
    Q_OBJECT
    Q_DECLARE_PRIVATE(QTableView)
public:
    explicit CustomerPrivacyTableVeiw(QWidget *parent = nullptr , const QString cornerText = "");
    virtual ~CustomerPrivacyTableVeiw();
    void setHierarchicalHeader(QHeaderView* header ,Qt::Orientation direction);
    void setCornerText(const QString text);

private:
    QHeaderView* m_veticalHeader;
    QHeaderView* m_horizontalHeader;
    QPushButton* m_cornerButton;
signals:

};


#include "CustomerPrivacyTableVeiw.h"
#include <QPushButton>
#include <private/qtableview_p.h>

CustomerPrivacyTableVeiw::CustomerPrivacyTableVeiw(QWidget *parent ,const QString cornerText) : QTableView(parent),
    m_veticalHeader(nullptr) , m_horizontalHeader(nullptr)
{
    m_cornerButton = new QPushButton(cornerText,this);
    Q_D(QTableView);
    disconnect(d->cornerWidget, SIGNAL(clicked()), this, SLOT(selectAll()));
    delete (d->cornerWidget);
    m_cornerButton->setObjectName("LabelCorner");
    d->cornerWidget = m_cornerButton;
    setSelectionMode(QAbstractItemView::SingleSelection);
    setObjectName("viewPropotion");
}

CustomerPrivacyTableVeiw::~CustomerPrivacyTableVeiw()
{
    delete m_cornerButton;
}

void CustomerPrivacyTableVeiw::setHierarchicalHeader(QHeaderView *header, Qt::Orientation direction)
{
    if(Qt::Horizontal == direction){
        m_veticalHeader = header;
        setHorizontalHeader(header);
        header->setSectionResizeMode(QHeaderView::Stretch);
    }
    else{
        m_horizontalHeader = header;
        setVerticalHeader(header);
    }
//    header->setParent(this);
    header->setObjectName(Qt::Horizontal == direction ?  "PrivacyTableViewHorizontalHeader" : "PrivacyTableViewVerticalHeader");
}

void CustomerPrivacyTableVeiw::setCornerText(const QString text)
{
    m_cornerButton->setText(text);
}


CustomerStandardModel::CustomerStandardModel(QObject *parent): QStandardItemModel(parent){

}

CustomerStandardModel::CustomerStandardModel(int rows, int columns, QObject *parent):
    QStandardItemModel(rows ,columns ,parent)
{

}

QVariant CustomerStandardModel::headerData(int section, Qt::Orientation orientation, int role) const{

    if(Qt::Vertical == orientation)
        switch (role) {
        case Qt::SizeHintRole:
            return QSize(80 ,80);
        case Qt::TextAlignmentRole:
            return Qt::AlignCenter;

        }
    return QStandardItemModel::headerData(section  , orientation ,role );
}


int main(int argc, char *argv[])
{
    QApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
    QApplication a(argc, argv);
    auto view = new CustomerPrivacyTableVeiw;
    auto model = new CustomerStandardModel();
    model->setColumnCount(5);
    for(int i = 0 ; i < 5 ; i ++)
        model->appendRow(new QStandardItem(QString::number(i)));

    view->setModel(model);
    view->setCornerText("序号");
    view->show();

    return a.exec();
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值