1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QHEADERVIEW_H
5#define QHEADERVIEW_H
6
7#include <QtWidgets/qtwidgetsglobal.h>
8#include <QtWidgets/qabstractitemview.h>
9#include <QtCore/qlist.h>
10
11QT_REQUIRE_CONFIG(itemviews);
12
13class tst_QHeaderView;
14
15QT_BEGIN_NAMESPACE
16
17class QHeaderViewPrivate;
18class QStyleOptionHeader;
19
20class Q_WIDGETS_EXPORT QHeaderView : public QAbstractItemView
21{
22 Q_OBJECT
23 Q_PROPERTY(bool firstSectionMovable READ isFirstSectionMovable WRITE setFirstSectionMovable)
24 Q_PROPERTY(bool showSortIndicator READ isSortIndicatorShown WRITE setSortIndicatorShown)
25 Q_PROPERTY(bool sectionsMovable READ sectionsMovable WRITE setSectionsMovable)
26 Q_PROPERTY(bool sectionsClickable READ sectionsClickable WRITE setSectionsClickable)
27 Q_PROPERTY(bool highlightSections READ highlightSections WRITE setHighlightSections)
28 Q_PROPERTY(bool stretchLastSection READ stretchLastSection WRITE setStretchLastSection)
29 Q_PROPERTY(bool cascadingSectionResizes READ cascadingSectionResizes
30 WRITE setCascadingSectionResizes)
31 Q_PROPERTY(int defaultSectionSize READ defaultSectionSize WRITE setDefaultSectionSize
32 RESET resetDefaultSectionSize)
33 Q_PROPERTY(int minimumSectionSize READ minimumSectionSize WRITE setMinimumSectionSize)
34 Q_PROPERTY(int maximumSectionSize READ maximumSectionSize WRITE setMaximumSectionSize)
35 Q_PROPERTY(Qt::Alignment defaultAlignment READ defaultAlignment WRITE setDefaultAlignment)
36 Q_PROPERTY(bool sortIndicatorClearable READ isSortIndicatorClearable
37 WRITE setSortIndicatorClearable NOTIFY sortIndicatorClearableChanged)
38
39public:
40
41 enum ResizeMode
42 {
43 Interactive,
44 Stretch,
45 Fixed,
46 ResizeToContents,
47 Custom = Fixed
48 };
49 Q_ENUM(ResizeMode)
50
51 explicit QHeaderView(Qt::Orientation orientation, QWidget *parent = nullptr);
52 virtual ~QHeaderView();
53
54 void setModel(QAbstractItemModel *model) override;
55
56 Qt::Orientation orientation() const;
57 int offset() const;
58 int length() const;
59 QSize sizeHint() const override;
60 void setVisible(bool v) override;
61 int sectionSizeHint(int logicalIndex) const;
62
63 int visualIndexAt(int position) const;
64 int logicalIndexAt(int position) const;
65
66 inline int logicalIndexAt(int x, int y) const;
67 inline int logicalIndexAt(const QPoint &pos) const;
68
69 int sectionSize(int logicalIndex) const;
70 int sectionPosition(int logicalIndex) const;
71 int sectionViewportPosition(int logicalIndex) const;
72
73 void moveSection(int from, int to);
74 void swapSections(int first, int second);
75 void resizeSection(int logicalIndex, int size);
76 void resizeSections(QHeaderView::ResizeMode mode);
77
78 bool isSectionHidden(int logicalIndex) const;
79 void setSectionHidden(int logicalIndex, bool hide);
80 int hiddenSectionCount() const;
81
82 inline void hideSection(int logicalIndex);
83 inline void showSection(int logicalIndex);
84
85 int count() const;
86 int visualIndex(int logicalIndex) const;
87 int logicalIndex(int visualIndex) const;
88
89 void setSectionsMovable(bool movable);
90 bool sectionsMovable() const;
91 void setFirstSectionMovable(bool movable);
92 bool isFirstSectionMovable() const;
93
94 void setSectionsClickable(bool clickable);
95 bool sectionsClickable() const;
96
97 void setHighlightSections(bool highlight);
98 bool highlightSections() const;
99
100 ResizeMode sectionResizeMode(int logicalIndex) const;
101 void setSectionResizeMode(ResizeMode mode);
102 void setSectionResizeMode(int logicalIndex, ResizeMode mode);
103
104 void setResizeContentsPrecision(int precision);
105 int resizeContentsPrecision() const;
106
107 int stretchSectionCount() const;
108
109 void setSortIndicatorShown(bool show);
110 bool isSortIndicatorShown() const;
111
112 void setSortIndicator(int logicalIndex, Qt::SortOrder order);
113 int sortIndicatorSection() const;
114 Qt::SortOrder sortIndicatorOrder() const;
115
116 void setSortIndicatorClearable(bool clearable);
117 bool isSortIndicatorClearable() const;
118
119 bool stretchLastSection() const;
120 void setStretchLastSection(bool stretch);
121
122 bool cascadingSectionResizes() const;
123 void setCascadingSectionResizes(bool enable);
124
125 int defaultSectionSize() const;
126 void setDefaultSectionSize(int size);
127 void resetDefaultSectionSize();
128
129 int minimumSectionSize() const;
130 void setMinimumSectionSize(int size);
131 int maximumSectionSize() const;
132 void setMaximumSectionSize(int size);
133
134 Qt::Alignment defaultAlignment() const;
135 void setDefaultAlignment(Qt::Alignment alignment);
136
137 void doItemsLayout() override;
138 bool sectionsMoved() const;
139 bool sectionsHidden() const;
140
141#ifndef QT_NO_DATASTREAM
142 QByteArray saveState() const;
143 bool restoreState(const QByteArray &state);
144#endif
145
146 void reset() override;
147
148public Q_SLOTS:
149 void setOffset(int offset);
150 void setOffsetToSectionPosition(int visualIndex);
151 void setOffsetToLastSection();
152 void headerDataChanged(Qt::Orientation orientation, int logicalFirst, int logicalLast);
153
154Q_SIGNALS:
155 void sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex);
156 void sectionResized(int logicalIndex, int oldSize, int newSize);
157 void sectionPressed(int logicalIndex);
158 void sectionClicked(int logicalIndex);
159 void sectionEntered(int logicalIndex);
160 void sectionDoubleClicked(int logicalIndex);
161 void sectionCountChanged(int oldCount, int newCount);
162 void sectionHandleDoubleClicked(int logicalIndex);
163 void geometriesChanged();
164 void sortIndicatorChanged(int logicalIndex, Qt::SortOrder order);
165 void sortIndicatorClearableChanged(bool clearable);
166
167protected Q_SLOTS:
168 void updateSection(int logicalIndex);
169 void resizeSections();
170 void sectionsInserted(const QModelIndex &parent, int logicalFirst, int logicalLast);
171 void sectionsAboutToBeRemoved(const QModelIndex &parent, int logicalFirst, int logicalLast);
172
173protected:
174 QHeaderView(QHeaderViewPrivate &dd, Qt::Orientation orientation, QWidget *parent = nullptr);
175 void initialize();
176
177 void initializeSections();
178 void initializeSections(int start, int end);
179 void currentChanged(const QModelIndex &current, const QModelIndex &old) override;
180
181 bool event(QEvent *e) override;
182 void paintEvent(QPaintEvent *e) override;
183 void mousePressEvent(QMouseEvent *e) override;
184 void mouseMoveEvent(QMouseEvent *e) override;
185 void mouseReleaseEvent(QMouseEvent *e) override;
186 void mouseDoubleClickEvent(QMouseEvent *e) override;
187 bool viewportEvent(QEvent *e) override;
188
189 virtual void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
190 virtual QSize sectionSizeFromContents(int logicalIndex) const;
191
192 int horizontalOffset() const override;
193 int verticalOffset() const override;
194 void updateGeometries() override;
195 void scrollContentsBy(int dx, int dy) override;
196
197 void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
198 const QList<int> &roles = QList<int>()) override;
199 void rowsInserted(const QModelIndex &parent, int start, int end) override;
200
201 QRect visualRect(const QModelIndex &index) const override;
202 void scrollTo(const QModelIndex &index, ScrollHint hint) override;
203
204 QModelIndex indexAt(const QPoint &p) const override;
205 bool isIndexHidden(const QModelIndex &index) const override;
206
207 QModelIndex moveCursor(CursorAction, Qt::KeyboardModifiers) override;
208 void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags flags) override;
209 QRegion visualRegionForSelection(const QItemSelection &selection) const override;
210 virtual void initStyleOptionForIndex(QStyleOptionHeader *option, int logicalIndex) const;
211 virtual void initStyleOption(QStyleOptionHeader *option) const;
212
213 friend class QTableView;
214 friend class QTreeView;
215 friend class ::tst_QHeaderView;
216
217private:
218 void initStyleOption(QStyleOptionFrame *option) const override;
219
220 Q_DECLARE_PRIVATE(QHeaderView)
221 Q_DISABLE_COPY(QHeaderView)
222};
223
224inline int QHeaderView::logicalIndexAt(int ax, int ay) const
225{ return orientation() == Qt::Horizontal ? logicalIndexAt(position: ax) : logicalIndexAt(position: ay); }
226inline int QHeaderView::logicalIndexAt(const QPoint &apos) const
227{ return logicalIndexAt(ax: apos.x(), ay: apos.y()); }
228inline void QHeaderView::hideSection(int alogicalIndex)
229{ setSectionHidden(logicalIndex: alogicalIndex, hide: true); }
230inline void QHeaderView::showSection(int alogicalIndex)
231{ setSectionHidden(logicalIndex: alogicalIndex, hide: false); }
232
233QT_END_NAMESPACE
234
235#endif // QHEADERVIEW_H
236

source code of qtbase/src/widgets/itemviews/qheaderview.h