1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the examples of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:BSD$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** BSD License Usage
18** Alternatively, you may use this file under the terms of the BSD license
19** as follows:
20**
21** "Redistribution and use in source and binary forms, with or without
22** modification, are permitted provided that the following conditions are
23** met:
24** * Redistributions of source code must retain the above copyright
25** notice, this list of conditions and the following disclaimer.
26** * Redistributions in binary form must reproduce the above copyright
27** notice, this list of conditions and the following disclaimer in
28** the documentation and/or other materials provided with the
29** distribution.
30** * Neither the name of The Qt Company Ltd nor the names of its
31** contributors may be used to endorse or promote products derived
32** from this software without specific prior written permission.
33**
34**
35** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
38** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
39** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
45** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
46**
47** $QT_END_LICENSE$
48**
49****************************************************************************/
50
51#include "freezetablewidget.h"
52
53#include <QScrollBar>
54#include <QHeaderView>
55
56//! [constructor]
57FreezeTableWidget::FreezeTableWidget(QAbstractItemModel * model)
58{
59 setModel(model);
60 frozenTableView = new QTableView(this);
61
62 init();
63
64 //connect the headers and scrollbars of both tableviews together
65 connect(horizontalHeader(),&QHeaderView::sectionResized, this,
66 &FreezeTableWidget::updateSectionWidth);
67 connect(verticalHeader(),&QHeaderView::sectionResized, this,
68 &FreezeTableWidget::updateSectionHeight);
69
70 connect(frozenTableView->verticalScrollBar(), &QAbstractSlider::valueChanged,
71 verticalScrollBar(), &QAbstractSlider::setValue);
72 connect(verticalScrollBar(), &QAbstractSlider::valueChanged,
73 frozenTableView->verticalScrollBar(), &QAbstractSlider::setValue);
74
75
76}
77//! [constructor]
78
79FreezeTableWidget::~FreezeTableWidget()
80{
81 delete frozenTableView;
82}
83
84//! [init part1]
85void FreezeTableWidget::init()
86{
87 frozenTableView->setModel(model());
88 frozenTableView->setFocusPolicy(Qt::NoFocus);
89 frozenTableView->verticalHeader()->hide();
90 frozenTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
91
92 viewport()->stackUnder(frozenTableView);
93//! [init part1]
94
95//! [init part2]
96 frozenTableView->setStyleSheet("QTableView { border: none;"
97 "background-color: #8EDE21;"
98 "selection-background-color: #999}"); //for demo purposes
99 frozenTableView->setSelectionModel(selectionModel());
100 for (int col = 1; col < model()->columnCount(); ++col)
101 frozenTableView->setColumnHidden(col, true);
102
103 frozenTableView->setColumnWidth(0, columnWidth(0) );
104
105 frozenTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
106 frozenTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
107 frozenTableView->show();
108
109 updateFrozenTableGeometry();
110
111 setHorizontalScrollMode(ScrollPerPixel);
112 setVerticalScrollMode(ScrollPerPixel);
113 frozenTableView->setVerticalScrollMode(ScrollPerPixel);
114}
115//! [init part2]
116
117
118//! [sections]
119void FreezeTableWidget::updateSectionWidth(int logicalIndex, int /* oldSize */, int newSize)
120{
121 if (logicalIndex == 0){
122 frozenTableView->setColumnWidth(0, newSize);
123 updateFrozenTableGeometry();
124 }
125}
126
127void FreezeTableWidget::updateSectionHeight(int logicalIndex, int /* oldSize */, int newSize)
128{
129 frozenTableView->setRowHeight(logicalIndex, newSize);
130}
131//! [sections]
132
133
134//! [resize]
135void FreezeTableWidget::resizeEvent(QResizeEvent * event)
136{
137 QTableView::resizeEvent(event);
138 updateFrozenTableGeometry();
139 }
140//! [resize]
141
142
143//! [navigate]
144QModelIndex FreezeTableWidget::moveCursor(CursorAction cursorAction,
145 Qt::KeyboardModifiers modifiers)
146{
147 QModelIndex current = QTableView::moveCursor(cursorAction, modifiers);
148
149 if (cursorAction == MoveLeft && current.column() > 0
150 && visualRect(current).topLeft().x() < frozenTableView->columnWidth(0) ){
151 const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x()
152 - frozenTableView->columnWidth(0);
153 horizontalScrollBar()->setValue(newValue);
154 }
155 return current;
156}
157//! [navigate]
158
159void FreezeTableWidget::scrollTo (const QModelIndex & index, ScrollHint hint){
160 if (index.column() > 0)
161 QTableView::scrollTo(index, hint);
162}
163
164//! [geometry]
165void FreezeTableWidget::updateFrozenTableGeometry()
166{
167 frozenTableView->setGeometry(verticalHeader()->width() + frameWidth(),
168 frameWidth(), columnWidth(0),
169 viewport()->height()+horizontalHeader()->height());
170}
171//! [geometry]
172
173
174