#ifndef FREEZETABLEVIEW_H
#define FREEZETABLEVIEW_H
#include
class QStandardItemModel;
//! [Widget definition]
class FreezeTreeView : public QTreeView
{
Q_OBJECT
public:
FreezeTreeView(QWidget * parent);
~FreezeTreeView();
virtual void setModel(QStandardItemModel * model);
void init();
protected:
void resizeEvent(QResizeEvent *event) override;
QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override;
//void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible) override;
private slots:
void updateSectionWidth(int logicalIndex, int oldSize, int newSize);
//void updateSectionHeight(int logicalIndex, int oldSize, int newSize);
void slotExpanded(const QModelIndex&index);
void slotcollapsed(const QModelIndex &index);
void updateselfGeometry(int logicalIndex, int oldSize, int newSize);
private:
void updateFrozenTableGeometry();
private:
QTreeView *frozenTreeView;
bool m_mark;
};
#endif // FREEZETABLEWIDGET_H
#include "freezetreeview.h"
#include
#include
#include
#include
#include
void FreezeTreeView::setModel(QStandardItemModel * model)
{
QTreeView::setModel(model);
frozenTreeView->setModel(model);
}
FreezeTreeView::FreezeTreeView(QWidget * parent)
: QTreeView(parent)
{
m_mark = false;
frozenTreeView = new QTreeView(this);
viewport()->stackUnder(frozenTreeView);
frozenTreeView->setFocusPolicy(Qt::NoFocus);
frozenTreeView->setStyleSheet("QTreeView { border: none;}");
frozenTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
connect(header(), &QHeaderView::sectionResized, this, &FreezeTreeView::updateSectionWidth);
connect(frozenTreeView->header(), &QHeaderView::sectionResized, this, &FreezeTreeView::updateselfGeometry);
connect(verticalScrollBar(), &QAbstractSlider::valueChanged, frozenTreeView->verticalScrollBar(), &QAbstractSlider::setValue);
connect(frozenTreeView, SIGNAL(expanded(const QModelIndex&)), this, SLOT(slotExpanded(const QModelIndex &)));
connect(frozenTreeView, SIGNAL(collapsed(const QModelIndex &)), this, SLOT(slotcollapsed(const QModelIndex &)));
connect(this, SIGNAL(collapsed(const QModelIndex &)), this, SLOT(slotcollapsed(const QModelIndex &)));
}
void FreezeTreeView::slotExpanded(const QModelIndex&index)
{
this->expand(index);
}
void FreezeTreeView::slotcollapsed(const QModelIndex &index)
{
this->collapse(index);
}
FreezeTreeView::~FreezeTreeView()
{
delete frozenTreeView;
}
void FreezeTreeView::init()
{
frozenTreeView->setSelectionModel(selectionModel());
for (int col = 1; col < this->model()->columnCount(); ++col)
frozenTreeView->setColumnHidden(col, true);
frozenTreeView->setColumnWidth(0, columnWidth(0) );
frozenTreeView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
frozenTreeView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
frozenTreeView->show();
updateFrozenTableGeometry();
setHorizontalScrollMode(ScrollPerPixel);
setVerticalScrollMode(ScrollPerPixel);
frozenTreeView->setVerticalScrollMode(ScrollPerPixel);
}
void FreezeTreeView::updateSectionWidth(int logicalIndex, int /* oldSize */, int newSize)
{
if (logicalIndex == 0){
frozenTreeView->setColumnWidth(0, newSize);
updateFrozenTableGeometry();
}
}
void FreezeTreeView::updateselfGeometry(int logicalIndex, int oldSize, int newSize)
{
frozenTreeView->setGeometry(1, 1, newSize,
viewport()->height() + header()->height());
this->setColumnWidth(0, newSize);
}
void FreezeTreeView::resizeEvent(QResizeEvent * event)
{
QTreeView::resizeEvent(event);
updateFrozenTableGeometry();
}
void FreezeTreeView::updateFrozenTableGeometry()
{
frozenTreeView->setGeometry(1, 1, columnWidth(0),
viewport()->height() + header()->height());
}
QModelIndex FreezeTreeView::moveCursor(CursorAction cursorAction,
Qt::KeyboardModifiers modifiers)
{
QModelIndex current = QTreeView::moveCursor(cursorAction, modifiers);
int x = visualRect(current).topLeft().x();
int column = current.column();
if (this->isExpanded(current)) {
frozenTreeView->expand(current);
}
else {
frozenTreeView->collapse(current);
}
return current;
}
//
//
//void FreezeTreeView::scrollTo (const QModelIndex & index, ScrollHint hint){
// if (index.column() > 0)
// QTreeView::scrollTo(index, hint);
//}
//
//void FreezeTreeView::slotPushButton()
//{
// QItemSelectionModel * model = this->selectionModel();
// QModelIndexList list = model->selectedIndexes();
// qDebug() << list.size();
//}