#include "HTableViewFixedAuto.h"
#include <iostream>
#include <map>
#include <QtGui/QLabel>
const QString TB_SHEET_QSS = "QTableWidget::item:hover{background-color:rgb(206,201,184,100)}"
"QTableWidget::item:selected{background-color:#1B89A1}"
"QHeaderView::section,QTableCornerButton:section{ \
padding:3px; margin:0px; color:#000000; border:1px solid #242424; \
border-left-width:0px; border-right-width:1px; border-top-width:0px; border-bottom-width:1px; \
background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #CEC9B8,stop:1 #CEC9B8); }"
"QTableWidget{background-color:white;border:none;}";
HTableViewFixedAuto::HTableViewFixedAuto(int fixedWidth, int fixedHeight, int maxRows, QStringList trHeader)
:m_fixedWidth(fixedWidth), m_fixedHeight(fixedHeight), m_maxRows(maxRows), m_headerList(trHeader)
{
std::vector<float> vcItemWidth;
m_fontSize = getHeaderWidthList(vcItemWidth, m_headerList, m_fixedWidth);
if (vcItemWidth.size() == 0 || m_fontSize == 0)
{
return;
}
this->createTableHeader();
if (m_stdModel)
{
m_vcItemWidthHeader = vcItemWidth;
this->initTableView(m_stdModel, vcItemWidth, m_fontSize);
}
}
int HTableViewFixedAuto::getHeaderWidthList(std::vector<float> &vcItemWidth,QStringList trHeader, int fixedWidth)
{
int sumWordNums = 0;
for (int i = 0; i < trHeader.size(); i++)
{
sumWordNums += trHeader[i].length();
}
float aveWordLength = fixedWidth / sumWordNums;
int fontSize = aveWordLength * 0.5;
for (int i = 0; i < trHeader.size(); i++)
{
vcItemWidth.push_back(trHeader[i].length() * aveWordLength);
}
float sumWordWidth = 0;
for (size_t i = 0; i < vcItemWidth.size(); i++)
{
sumWordWidth += vcItemWidth[i];
}
//每一列精度转换过程中出现损失,导致所有列数总宽度小于实际宽度,此时将宽度值补偿到各个列当中
for (int i = 0; i < (fixedWidth - sumWordWidth); i++)
{
vcItemWidth[i % trHeader.size()] = vcItemWidth[i % trHeader.size()] + 1;
}
return fontSize;
}
void HTableViewFixedAuto::createTableHeader()
{
m_stdModel = new QStandardItemModel();
m_itmSelectModel = new QItemSelectionModel(m_stdModel);
this->setModel(m_stdModel);
this->setSelectionModel(m_itmSelectModel);
this->setEditTriggers(QTableView::NoEditTriggers);
this->setSelectionBehavior(QAbstractItemView::SelectRows);
this->setStyleSheet(TB_SHEET_QSS);
this->verticalHeader()->hide();
this->setFixedSize(m_fixedWidth, m_fixedHeight);
}
void HTableViewFixedAuto::initTableView(QStandardItemModel *stdModel, std::vector<float> vcItemWidth, int fontSize)
{
float fontHeight = this->getPixelHeightFromSize(fontSize) / 0.6; //通过字体高度预估头高
int aveHeight = (m_fixedHeight - fontHeight) / m_maxRows; //计算内容每一行平均高度
this->verticalHeader()->setDefaultSectionSize(aveHeight);
QFont font("Microsoft YaHei");
font.setPixelSize(fontSize);
this->horizontalHeader()->setFont(font);
for (int i = 0; i < m_headerList.size(); i++)
{
stdModel->setHorizontalHeaderItem(i, new QStandardItem(m_headerList[i]));
}
int sumColumnWidth = 0;
for (size_t i = 0; i < vcItemWidth.size(); i++)
{
this->setColumnWidth(i, vcItemWidth[i]);
sumColumnWidth += vcItemWidth[i];
}
int sumSubFinal = sumColumnWidth - m_fixedWidth;
if (sumSubFinal > 1 || sumSubFinal < -1)
{
this->setColumnWidth(0, vcItemWidth[0] - sumSubFinal); //最终所有列宽度跟实际对比,如果有偏差,则用第一列补偿
}
int contListHeight = aveHeight *m_maxRows;
this->horizontalHeader()->setFixedHeight(m_fixedHeight - contListHeight); //设置头高度
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //设置关闭水平滚动条
this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //设置关闭垂直滚动条
}
QStandardItemModel *HTableViewFixedAuto::getItemModel()
{
if (m_stdModel)
{
return m_stdModel;
}
return nullptr;
}
void HTableViewFixedAuto::initTableHeader()
{
if (m_stdModel)
{
m_stdModel->clear();
this->initTableView(m_stdModel, m_vcItemWidthHeader, m_fontSize);
}
}
void HTableViewFixedAuto::setTbvFormatByRow(QStandardItemModel *model, int row)
{
QFont font("song");
font.setPixelSize(20);
for (int i = 0; i < model->columnCount(); i++)
{
if (model->item(row, i))
{
model->item(row, i)->setFont(font);
model->item(row, i)->setTextAlignment(Qt::AlignCenter);
}
}
}
int HTableViewFixedAuto::getPixelHeightFromSize(int microsoftYaHei)
{
QLabel *lblFont = new QLabel(QObject::tr("字"));
QFont font("Microsoft YaHei");
font.setPixelSize(microsoftYaHei);
lblFont->setFont(font);
lblFont->adjustSize();
return lblFont->height(); //获取对应大小字体的字体高度
}
评论0