This repository was archived by the owner on Jul 8, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilterHeaderView.cpp
More file actions
117 lines (116 loc) · 3.97 KB
/
Copy pathFilterHeaderView.cpp
File metadata and controls
117 lines (116 loc) · 3.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "FilterHeaderView.h"
CFilterHeaderView::CFilterHeaderView(QWidget* parent)
: QHeaderView(Qt::Horizontal, parent)
{
setSectionsClickable(true);
}
void CFilterHeaderView::onUpdateCheckState(const QModelIndex& index)
{
if (!index.isValid())return;
QVariant checkStateVar = model()->data(index, Qt::CheckStateRole);
if (checkStateVar.isValid())
{
(checkStateVar.toInt() == Qt::Checked) ? (++m_checkedNum) : (--m_checkedNum);
if (m_checkedNum <= 0)
model()->setHeaderData(index.column(), orientation(), Qt::Unchecked, Qt::CheckStateRole);
else if (m_checkedNum >= model()->rowCount())
model()->setHeaderData(index.column(), orientation(), Qt::Checked, Qt::CheckStateRole);
else
model()->setHeaderData(index.column(), orientation(), Qt::PartiallyChecked, Qt::CheckStateRole);
}
}
void CFilterHeaderView::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const
{
painter->save();
QHeaderView::paintSection(painter, rect, logicalIndex);
painter->restore();
QVariant checkStateVar = model()->headerData(logicalIndex, orientation(), Qt::CheckStateRole);
if (checkStateVar.isValid())
{
QStyleOptionViewItem option;
option.initFrom(this);
option.checkState = static_cast<Qt::CheckState>(checkStateVar.toInt());
option.features = QStyleOptionViewItem::HasCheckIndicator;
option.viewItemPosition = QStyleOptionViewItem::OnlyOne;
style()->drawControl(QStyle::CE_ItemViewItem, &option, painter, this);
}
QVariant filterVar = model()->headerData(logicalIndex, orientation(), FilterRole);
if (filterVar.isValid() && filterVar.toBool())
{
QPixmap pix = m_norFilterPix;
bool b_contain = getFilterRect(rect).contains(cursor().pos());
if (logicalIndex == m_hover && b_contain)
pix = m_hovFilterPix;
if (logicalIndex == m_press && b_contain)
pix = m_preFilterPix;
int align = Qt::AlignRight | Qt::AlignVCenter;
QVariant alignVar = model()->headerData(logicalIndex, orientation(), FilterAlignmentRole);
if (alignVar.isValid())
align = alignVar.toInt();
style()->drawItemPixmap(painter, rect, align, pix);
}
}
void CFilterHeaderView::mousePressEvent(QMouseEvent* e)
{
m_press = logicalIndexAt(e->pos());
if (m_press != -1)
updateSection(m_press);
QVariant checkStateVar = model()->headerData(m_press, orientation(), Qt::CheckStateRole);
if (checkStateVar.isValid())
{
Qt::CheckState checkState = static_cast<Qt::CheckState>(checkStateVar.toInt());
checkState = (checkState == Qt::Checked) ? Qt::Unchecked : Qt::Checked;
model()->setHeaderData(m_press, orientation(), checkState, Qt::CheckStateRole);
// 更新选中行数
m_checkedNum = (checkState == Qt::Checked) ? model()->rowCount() : 0;
for (int r = 0; r < model()->rowCount(); ++r)
{
QModelIndex index = model()->index(r, m_press);
model()->setData(index, checkState, Qt::CheckStateRole);
}
}
QHeaderView::mousePressEvent(e);
}
void CFilterHeaderView::mouseReleaseEvent(QMouseEvent* e)
{
if (e->button() == Qt::RightButton)
{
int section = logicalIndexAt(e->pos());
QVariant filterVar = model()->headerData(section, orientation(), FilterRole);
if (filterVar.isValid() && filterVar.toBool())
{
QRect rect(sectionViewportPosition(section), 0, sectionSize(section), height());
if (getFilterRect(rect).contains(cursor().pos()))
emit filterClicked(section);
}
}
m_press = -1;
QHeaderView::mouseReleaseEvent(e);
}
void CFilterHeaderView::mouseMoveEvent(QMouseEvent* e)
{
m_hover = logicalIndexAt(e->pos());
if (m_hover != -1)
updateSection(m_hover);
QHeaderView::mouseMoveEvent(e);
}
bool CFilterHeaderView::event(QEvent* e)
{
switch (e->type())
{
case QEvent::Leave:
case QEvent::HoverLeave:
if (m_hover != -1)
updateSection(m_hover);
m_hover = -1;
break;
default:
break;
}
return QHeaderView::event(e);
}
QRect CFilterHeaderView::getFilterRect(const QRect& rect) const
{
QPoint g_topRight = mapToGlobal(rect.topRight());
return QRect(g_topRight - QPoint(m_norFilterPix.width(), (m_norFilterPix.height() - rect.height()) / 2), m_norFilterPix.size());
}