Qt QTreeWidget 固定第一列

这篇博客介绍了一个使用Qt实现QTreeWidget固定第一列的方法,通过创建一个QFrozenTreeWidget类,实现了在窗口缩放时保持第一列固定不变的效果。博客详细讲解了类的实现过程,包括构造函数、事件处理、同步操作等关键代码,适用于需要在Qt界面中使用QTreeWidget并保持第一列固定显示的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值