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();
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: QTableView是Qt中的一个控件,用于显示表格数据。而自定义Model则是指用户可以自己编写一个继承自QAbstractTableModel的类,来实现自己的数据模型。这样,用户就可以通过自定义Model来控制QTableView中显示的数据,包括数据的格式、排序、过滤等等。自定义Model是Qt中非常常见的一种技术,可以帮助用户更好地管理和展示数据。 ### 回答2: QTableView是Qt中用于展示表格数据的控件,在实际应用中经常需要自定义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: QTableView是Qt中常用的控件之一,它用于展示表格数据。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,我们可以更好地控制、管理和操作表格中的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值