105 lines
3.6 KiB
C++
105 lines
3.6 KiB
C++
#include "multiLineHeaderView.h"
|
||
#include <QPainter>
|
||
|
||
MultiLineHeaderView::MultiLineHeaderView(Qt::Orientation orientation, QWidget* parent)
|
||
: QHeaderView(orientation, parent)
|
||
{
|
||
m_linSpacing = 2;
|
||
m_bgColor = QColor(Qt::white);
|
||
m_borderColor = QColor(Qt::lightGray);
|
||
setSectionResizeMode(QHeaderView::ResizeToContents);//根据内容自动调整大小
|
||
}
|
||
|
||
void MultiLineHeaderView::setLineSpacing(int spacing)
|
||
{
|
||
m_linSpacing = spacing;
|
||
}
|
||
|
||
void MultiLineHeaderView::setBackgroundColor(QColor& color)
|
||
{
|
||
m_bgColor = color;
|
||
}
|
||
|
||
void MultiLineHeaderView::setBorderColor(QColor& color)
|
||
{
|
||
m_borderColor = color;
|
||
}
|
||
|
||
void MultiLineHeaderView::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const
|
||
{
|
||
if(!painter->isActive())
|
||
return;
|
||
|
||
//绘制背景
|
||
painter->fillRect(rect, m_bgColor);
|
||
//获取文本
|
||
QString text = model()->headerData(logicalIndex, orientation()).toString();
|
||
QStringList lines = text.split('\n');
|
||
//获取当前列的样式
|
||
QMap<int, HeaderLineStyle> styles = m_sectionStyles.value(logicalIndex);
|
||
//计算总高度并垂直居中
|
||
int totalHeight = 0;
|
||
QVector<int> lineHeights;
|
||
for(int i = 0; i < lines.size(); i++)
|
||
{
|
||
HeaderLineStyle style = styles.value(i, m_defaultStyle);
|
||
QFontMetrics fm(style.font);
|
||
lineHeights.append(fm.height());
|
||
totalHeight += fm.height() + (i < lines.size() - 1 ? m_linSpacing : 0);
|
||
}
|
||
int y = rect.y() + (rect.height() - totalHeight) * 0.5;
|
||
//逐行绘制文本
|
||
for(int i = 0; i < lines.size(); i++)
|
||
{
|
||
const QString& line = lines.at(i);
|
||
HeaderLineStyle style = styles.value(i, m_defaultStyle);
|
||
QFontMetrics fm(style.font);
|
||
//水平位置
|
||
int padding = 10;
|
||
int x = rect.x() + padding; //左对齐
|
||
if(style.alignment & Qt::AlignRight) //右对齐
|
||
x = rect.right() - fm.horizontalAdvance(line) - 4;//'horizontalAdvance'计算文本的横向距离
|
||
else if(style.alignment & Qt::AlignHCenter) //水平居中
|
||
x = rect.x() + (rect.width() - fm.horizontalAdvance(line)) * 0.5;
|
||
//设置字体和颜色
|
||
painter->setFont(style.font);
|
||
painter->setPen(style.color);
|
||
//绘制文本
|
||
painter->drawText(x, y + fm.ascent(), line); //绘制文本的基线X轴离文本上方的距离为ascent,下方距离为descent
|
||
y = y + lineHeights[i] + m_linSpacing;
|
||
}
|
||
|
||
//绘制边框
|
||
QPen pen(m_borderColor, 1);
|
||
painter->setPen(pen);
|
||
QRect adjustRect = rect.adjusted(0, 0, 1, 0);
|
||
painter->drawLine(adjustRect.topLeft(), adjustRect.bottomLeft());
|
||
painter->drawLine(adjustRect.topRight(), adjustRect.bottomRight());
|
||
}
|
||
//自动调整行高
|
||
QSize MultiLineHeaderView::sectionSizeFromContents(int logicalIndex) const
|
||
{
|
||
//获取文本
|
||
QString text = model()->headerData(logicalIndex, orientation()).toString();
|
||
//获取当前列的样式
|
||
QMap<int, HeaderLineStyle> styles = m_sectionStyles.value(logicalIndex);
|
||
QStringList lines = text.split('\n');
|
||
int maxWidth = 0;
|
||
int totalHeight = 0;
|
||
for(int i = 0; i < lines.size(); i++)
|
||
{
|
||
HeaderLineStyle style = styles.value(i, m_defaultStyle);
|
||
QFontMetrics fm(style.font);
|
||
maxWidth = qMax(maxWidth, fm.horizontalAdvance(lines[i]));
|
||
totalHeight += fm.height() + (i < lines.size() - 1 ? m_linSpacing : 0);
|
||
}
|
||
//qDebug() << maxWidth << "," << totalHeight;
|
||
return QSize(maxWidth + 20, totalHeight + 4);
|
||
}
|
||
|
||
void MultiLineHeaderView::setSectionLineStyle(int section, int line, const HeaderLineStyle& style)
|
||
{
|
||
m_sectionStyles[section][line] = style;
|
||
updateSection(section);
|
||
}
|