运行结果
需求概要
在使用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);
}