Qt QTreeWidget 固定第一列

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 &
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用QTreeWidget的setItemWidget方法来设置每个单元格的控件。您可以为第二的所有单元格创建一个QLabel控件,并将其宽度设置为30像素,然后将它们设置为第二的控件。为第一列的所有单元格创建另一个QLabel控件,并将其设置为第一列的控件。以下是一个示例代码片段,演示如何实现这一点: ```python # 创建QTreeWidget对象 treeWidget = QTreeWidget() # 设置数为2 treeWidget.setColumnCount(2) # 循环设置每一行 for i in range(5): # 创建两个QLabel控件 label1 = QLabel() label2 = QLabel() # 设置第一列控件的文本 label1.setText("Item " + str(i)) # 设置第二控件的文本,并将其宽度设置为30像素 label2.setText("Info " + str(i)) label2.setFixedWidth(30) # 创建一个QTreeWidgetItem对象,并将两个控件添加到它中 item = QTreeWidgetItem() item.setTextAlignment(0, Qt.AlignLeft | Qt.AlignVCenter) item.setTextAlignment(1, Qt.AlignLeft | Qt.AlignVCenter) item.setFlags(item.flags() & ~Qt.ItemIsEditable) treeWidget.addTopLevelItem(item) treeWidget.setItemWidget(item, 0, label1) treeWidget.setItemWidget(item, 1, label2) ``` 在这个示例代码中,我们使用了QTreeWidget的setItemWidget方法来为每个单元格设置控件。我们首先创建了两个QLabel控件,一个用于第一列,一个用于第二。我们将第一列控件的文本设置为“Item i”,其中i是当前行的索引。我们将第二控件的文本设置为“Info i”,并将其宽度设置为30像素。接下来,我们创建一个QTreeWidgetItem对象,并将两个控件添加到它中。最后,我们使用setItemWidget方法将控件设置为相应的单元格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值