【无标题】QTableWidget表头添加排序菜单

运行结果

在这里插入图片描述

需求概要

在使用QTableWidget时,表头需要添加排序按钮的功能

实现过程

1.构造一个类MyTableHeadView继承表头类QHeaderView

#pragma once
#include <qheaderview.h>

class MyTableHeadView : public QHeaderView
{
    Q_OBJECT

public:
    MyTableHeadView(Qt::Orientation orientation, QWidget* parent = nullptr);
    void setSectionWidget(int logicalIndex, QWidget* w);

private:
    virtual void paintSection(QPainter* painter, const QRect& rect, int logicalIndex) 
        const override;
    //Ui::MyTableHeadViewClass ui;
    QHash<int, QWidget*> m_hashWidget;
};

源文件

#include "MyTableHeadView.h"

MyTableHeadView::MyTableHeadView(Qt::Orientation orientation, QWidget* parent)
    : QHeaderView(orientation,parent)
{
}

void MyTableHeadView::setSectionWidget(int logicalIndex, QWidget* w)
{
    m_hashWidget.insert(logicalIndex, w);
}

void MyTableHeadView::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const
{
    QHeaderView::paintSection(painter, rect, logicalIndex);
    auto w = m_hashWidget.value(logicalIndex);
    if (w)
    {
        QStyleOptionHeader option;
        initStyleOption(&option);
        w->setGeometry(rect);
    }
}

2.主窗体

MyDialog::MyDialog(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
    QTableWidget* table = new QTableWidget();
    table->setRowCount(2);
    table->setColumnCount(2);
    QStringList str;
    str << u8"姓名" << u8"年龄";
    table->setHorizontalHeaderLabels(str);
    MyTableHeadView* w = new MyTableHeadView(Qt::Horizontal, table);

    for (int col = 0; col < table->columnCount(); col++)
    {
        QMenu* m = new QMenu();
        m->setStyleSheet("QMenu::indicator{"
                         "subcontrol-position:right center;"
                         "padding-right:5px;"
                         "color:white;}");
        QAction* inc = new QAction(u8"升序");
        QAction* dec = new QAction(u8"降序");
        m->addAction(inc);
        m->addAction(dec);

        QToolButton* pbt = new QToolButton(w);
        pbt->setText(str[col]);
        pbt->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
        connect(pbt, &QToolButton::clicked, this, [=]() {
            QPoint pos = pbt->mapToGlobal(QPoint(pbt->width(), pbt->height()));
            m->exec(pos);
            });

        pbt->setMenu(m);
        w->setSectionWidget(col, pbt);
    }

    table->setHorizontalHeader(w);
    setCentralWidget(table);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值