Qt 有一个demo "Frozen Column Example"是QTableView固定第一列,我仿照着写了一个QTreeWidget固定第一列。
头文件 “QFrozenTreeWidget.h”
#ifndef QFROZENTREEWIDGET_H#define QFROZENTREEWIDGET_H
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QResizeEvent>
//定位结构体,用来存储 展合、勾选 的item位置
struct structIndex
{
int m_index;
structIndex *m_pChildIndex;
structIndex()
{
m_index = -1;
m_pChildIndex = NULL;
}
};
class QFrozenTreeWidget : public QTreeWidget
{
Q_OBJECT
public:
QFrozenTreeWidget(QWidget *parent = 0);
~QFrozenTreeWidget();
//接口
public:
void SetFrozenColumnHeader(const QString &strHeader);
void CreateNewItem(QTreeWidgetItem *item);
protected:
void resizeEvent(QResizeEvent *event);
QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
void scrollTo(const QModelIndex &index, ScrollHint hint);
private:
void Init();
void UpdateFrozenTreeGeometry();
/*
* 用来 从 固定列和本树 找对应的item
* 比如 固定列某个item展开,要找到本树的对应位置item让其展开,实现同步
* 下面是递归方法
* 可能还有简单方法,比如:
* 可以根据 鼠标位置 找到对应item,用itemAt(QPoint);
* 可以根据 item 对应的QModelIndex 里row() 采用加法找到对应item,有兴趣的可以实现试试
*/
structIndex *GetItemIndex(QTreeWidgetItem *targetItem, QTreeWidgetItem *sourceItem);
QTreeWidgetItem *GetItemFromIndex(QTreeWidgetItem *item, structIndex *index);
QTreeWidgetItem *GetItemFromItem(QTreeWidget *targetTree, QTreeWidgetItem *souceItem);
/*
* 下面实现同步勾选
*/
void SetParentCheckState(QTreeWidgetItem *parentItem);
void SetChildCheckState(QTreeWidgetItem *selfItem);
void SetItemChecked(QTreeWidgetItem *item);
private slots:
void OnItemCollapsed(QTreeWidgetItem *item);
void OnItemExpanded(QTreeWidgetItem *item);
void OnItemChanged(QTreeWidgetItem *item, int column);
void UpdateSectionWidthSlot(int logicalIndex, int, int newSize);
private:
QTreeWidget *m_pFrozenTreeWidget; //固定的第一列,覆盖在本树第一列位置,实现第一列保持不动
};
#endif // QFROZENTREEWIDGET_H
cpp文件 "QFrozenTreeWidget.cpp"
#include <QHeaderView>#include <QScrollBar>#include "QFrozenTreeWidget.h"QFrozenTreeWidget::QFrozenTreeWidget(QWidget *parent): QTreeWidget(parent){
Init();}
QFrozenTreeWidget::~QFrozenTreeWidget(){
}
void QFrozenTreeWidget::SetFrozenColumnHeader(const QString &