#include <QPainter>
#include <QMouseEvent>
#include <QIcon>
#include <QCursor>
#include <QMenu>
#include <QAction>
#include "HHeaderView.h"
#include "HHeaderItemDelegate.h"
#include "HHeaderModel.h"
#include "DataTreeView.h"
HHeaderView* HHeaderView::_Instance = NULL;
HHeaderView::HHeaderView(Qt::Orientation orientation, QWidget * parent) : QHeaderView(orientation, parent)
{
_Instance = this;
//设置代理,由代理进行画单元格
HHeaderItemDelegate* delegate = new HHeaderItemDelegate();
setItemDelegate(delegate);
connect(this, SIGNAL(sectionResized(int,int,int)), this, SLOT(onSectionResized(int,int,int)));
this->setResizeMode(QHeaderView::Interactive);
//setCascadingSectionResizes(true);
//this->setOffset(-5);
this->setMovable(true);
setClickable(true);
//setMinimumSectionSize(166);
//setStretchLastSection(true);
//setHighlightSections(true);
//setAttribute(Qt::WA_Hover, false);
this->setWindowIcon(QIcon("./Resources/logo.ico"));
// setDefaultSectionSize(100);
_menu = new QMenu(this);
_actHideCol = new QAction(this);
_actHideCol->setText("隐藏列");
_actHideCol->setIcon(QIcon(":/Resources/scene.svg"));
_actsortUp = new QAction(this);
_actsortUp->setText("按A->Z排序");
_actsortUp->setIcon(QIcon(":/Resources/scene.svg"));
_actSortDown = new QAction(this);
_actSortDown->setText("按Z->A排序");
_actSortDown->setIcon(QIcon(":/Resources/scene.svg"));
_menu->addAction(_actHideCol);
_menu->addAction(_actsortUp);
_menu->addAction(_actSortDown);
_menu->hide();
}
HHeaderView::~HHeaderView()
{
}
int HHeaderView::sectionSizes(int lIndex, int sectionCount)
{
int width = 0;
for(int i = lIndex; i < lIndex + sectionCount; ++i)
{
width += sectionSize(i);
}
return width;
}
QSize HHeaderView::sectionSizeFromContents(int logicalIndex) const
{
//return QHeaderView::sectionSizeFromContents(logicalIndex);
QSize size;
int maxWidth = 0;
HHeaderModel* model = static_cast<HHeaderModel*> (this->model());
for(int i = 0; i < model->rowCount(QModelIndex()); ++i)
{
QFont fnt;
QStyleOptionHeader opt;
initStyleOption(&opt);
fnt.setBold(true);
opt.text = model->item(i, logicalIndex);
opt.fontMetrics = QFontMetrics(fnt);
size = style()->sizeFromContents(QStyle::CT_HeaderSection, &opt, QSize(), this);
maxWidth = qMax(maxWidth, size.width());
}
return QSize(maxWidth + 4, size.height() * model->rowCount(QModelIndex())); //主要是设置高度,宽度这里设指了没有用,需要由headerview的父窗体里设置
}
void HHeaderView::paintEvent(QPaintEvent *event)
{
QPainter painter(viewport());
QMultiMap<int, int> rowSpanList;
int cnt = this->count ();
int curRow, curCol;
HHeaderModel* model = static_cast<HHeaderModel*> (this->model());
for(int row = 0; row < model->rowCount(QModelIndex()); ++row)
{
for(int col = 0; col < model->columnCount(QModelIndex()); ++col)
{
curRow = row;
curCol = col;
QStyleOptionViewItemV4 opt = viewOptions();
QStyleOptionHeader header_opt;
initStyleOption(&header_opt);
header_opt.textAlignment = Qt::AlignCenter;
// header_opt.icon = QIcon("./Resources/logo.ico");
QFont fnt;
fnt.setBold(true);
header_opt.fontMetrics = QFontMetrics(fnt);
opt.fontMetrics = QFontMetrics(fnt);
QSize size = style()->sizeFromContents(QStyle::CT_HeaderSection, &header_opt, QSize(), this);
// size.setHeight(25);
header_opt.position = QStyleOptionHeader::Middle;
//判断当前行是否处于鼠标悬停状态
if(_hoverIndex == model->index(row, col, QModelIndex()))
{
header_opt.state |= QStyle::State_MouseOver;
// header_opt.state |= QStyle::State_Active;
}
opt.text = model->item(row, col);
header_opt.text = model->item(row, col);
CellSpan span = model->getSpan(row, col);
int rowSpan = span._rowSpan;
int columnSpan = span._colSpan;
if(columnSpan > 1 && rowSpan > 1)
{//单元格跨越多列和多行, 不支持,改为多行1列
continue;
/*header_opt.rect = QRect(sectionViewportPosition(logicalIndex(col)), row * size.height(), sectionSizes(col, columnSpan), rowSpan * size.height());
opt.rect = header_opt.rect;
col += columnSpan - 1; */
}
else if(columnSpan > 1)
{//单元格跨越多行
header_opt.rect = QRect(sectionViewportPosition(logicalIndex(col)), row * size.height(), sectionSizes(col, columnSpan), size.height());
opt.rect = header_opt.rect;
col += columnSpan - 1;
}
else if(rowSpan > 1)
{//单元格跨越多行
header_opt.rect = QRect(sectionViewportPosition(logicalIndex(col)), row * size.height(), sectionSize(logicalIndex(col)), size.height() * rowSpan);
opt.rect = header_opt.rect;
for(int i = row + 1; i <= rowSpan - 1; ++i)
{
rowSpanList.insert(i, col);
}
}
else
{//正常的单元格
header_opt.rect = QRect(sectionViewportPosition(logicalIndex(col)), row * size.height(), sectionSize(logicalIndex(col)), size.height());
opt.rect = header_opt.rect;
}
opt.state = header_opt.state;
//opt.displayAlignment = Qt::AlignCenter;
opt.icon = QIcon("./Resources/logo.ico");
//opt.backgroundBrush = QBrush( QColor(255,0,0));
QMultiMap<int, int>::iterator it = rowSpanList.find(curRow, curCol);
if(it == rowSpanList.end())
{
//保存当前item的矩形
_itemRectMap[curRow][curCol] = header_opt.rect;
itemDelegate()->paint(&painter, opt, model->index(curRow, curCol, QModelIndex()));
}
else
{
//如果是跨越多行1列的情况,采用默认的paint
}
}
}
}
void HHeaderView::onSectionResized(int logicalIndex, int oldSize, int newSize)
{
if (0 == newSize)
{//过滤掉隐藏列导致的resize
viewport()->update();
return;
}
static bool selfEmitFlag = false;
if (selfEmitFlag)
{
return;
}
int minWidth = 99999;
QFontMetrics metrics(this->font());
//获取这列上最小的字体宽度,移动的长度不能大于最小的字体宽度
HHeaderModel* model = static_cast<HHeaderModel*> (this->model());
for(int i = 0; i < model->rowCount(QModelIndex()); ++i)
{
QString text = model->item(i, logicalIndex);
if (text.isEmpty())
continue;
int textWidth = metrics.width(text);
if (minWidth > textWidth)
{
minWidth = textWidth;
}
}
if (newSize < minWidth)
{
selfEmitFlag = true;
this->resizeSection(logicalIndex, oldSize);
selfEmitFlag = false;
}
viewport()->update();
}
/*
int HHeaderView::sectionSizeHint(int logicalIndex)
{
if (logicalIndex == 0)
{
return 10;
}
}
*/
//算出当前鼠标位置所在的index
QModelIndex HHeaderView::indexAt(const QPoint& pos) const
{
int x = pos.x();
int y = pos.y();
QMap<int, QRect>::Iterator iterCol;
QMap<int, QMap<int, QRect> >::Iterator iterRow = _itemRectMap.begin();
for (; iterRow != _itemRectMap.end(); ++iterRow)
{
for (iterCol = iterRow.value().begin(); iterCol != iterRow.value().end(); ++iterCol)
{
if(x > it
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
MyTableView.rar (83个子文件)
MyTableView
MyTableView.sln 900B
Win32
Release
MyTableView.exe 1.36MB
Debug
MyTableView.sln.docstates.suo 262B
MyTableView
DrawGantt.cpp 2KB
DrawGantt.h 257B
NodeManager.cpp 4KB
HHeaderView.cpp 14KB
mytableview.qrc 694B
DataTreeDelegate.h 791B
SortFilterModel.cpp 356B
HHeaderView.h 3KB
HHeaderItemDelegate.cpp 7KB
DataTreeView.h 892B
Const.h 460B
DataModel.h 846B
DataNode.h 2KB
HHeaderModel.cpp 4KB
Resources
logo.ico 91KB
redo.ico 97KB
show.ico 97KB
down.ico 97KB
hide.ico 97KB
update.ico 97KB
addsummary.ico 97KB
up.ico 97KB
zoomout.ico 97KB
scene.svg 9KB
scale.svg 3KB
addtask.ico 97KB
undo.ico 97KB
delete.ico 97KB
search.svg 22KB
.svn
all-wcprops 2KB
prop-base
down.ico.svn-base 53B
up.ico.svn-base 53B
addtask.ico.svn-base 53B
delete.ico.svn-base 53B
zoomin.ico.svn-base 53B
hide.ico.svn-base 53B
logo.ico.svn-base 53B
addsummary.ico.svn-base 53B
redo.ico.svn-base 53B
undo.ico.svn-base 53B
show.ico.svn-base 53B
update.ico.svn-base 53B
zoomout.ico.svn-base 53B
props
tmp
prop-base
props
text-base
text-base
down.ico.svn-base 97KB
up.ico.svn-base 97KB
addtask.ico.svn-base 97KB
search.svg.svn-base 22KB
delete.ico.svn-base 97KB
zoomin.ico.svn-base 97KB
hide.ico.svn-base 97KB
logo.ico.svn-base 91KB
addsummary.ico.svn-base 97KB
redo.ico.svn-base 97KB
undo.ico.svn-base 97KB
show.ico.svn-base 97KB
scene.svg.svn-base 9KB
update.ico.svn-base 97KB
zoomout.ico.svn-base 97KB
scale.svg.svn-base 3KB
entries 3KB
zoomin.ico 97KB
MyTableView.vcxproj.filters 7KB
DataNode.cpp 4KB
NodeManager.h 2KB
VHeaderView.cpp 2KB
VHeaderModel.cpp 2KB
HHeaderItemDelegate.h 748B
main.cpp 7KB
MyTableView.vcxproj.user 575B
DataTreeDelegate.cpp 4KB
DataModel.cpp 5KB
VHeaderView.h 603B
VHeaderModel.h 795B
TableView.cpp 4KB
TableView.h 731B
HHeaderModel.h 2KB
MyTableView.vcxproj 31KB
SortFilterModel.h 463B
DataTreeView.cpp 10KB
MyTableView.suo 11KB
共 83 条
- 1
wuzhongxian
- 粉丝: 5
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页