QCombox实现下拉树结构,QTreeView Model 数据层设置及实现代码

本文详细介绍了如何在Qt中实现QComboBox控件显示下拉树结构,包括数据结构设计、数据管理层实现、Model数据的实现以及窗体类的创建。通过自定义QAbstractItemModel和QTreeView,实现了在QComboBox中展示树形结构的功能。
摘要由CSDN通过智能技术生成

Qcombox拉下一树形结构显示,这里提供具体的实现逻辑,分别由 窗体、数据层管理结构设计、QAbstractItemModel,每一个节点的数据信息,实现代码,实现关键是setModel 和setView的使用

第一、每一个节点的数据结构形式

#pragma once
#include <QComboBox>
#include <QFrame>
#include <Qlist>
#include <QTreeView>
#include <QDialog>

class TreeViewDataInfo;

typedef QList<TreeViewDataInfo*> TreeViewDataInfoList;
class TreeViewDataInfo
{
public:
    TreeViewDataInfo(TreeViewDataInfo* pParent = NULL);
    ~TreeViewDataInfo();
    int childCount() const;
    //存在子信息
    int childExists(const TreeViewDataInfo* pMap) const;
    TreeViewDataInfo* parentInfo() const;
public:
    QString m_TreeItmeName;
    TreeViewDataInfoList m_ChildList;  //子节点的集合
    TreeViewDataInfo* m_pParentInfo;  // 父节点信息
    int m_childCount;
};

第二、数据层管理管理设计

class TreeViewItem : public QObject
{
public:
    explicit TreeViewItem(TreeViewDataInfo* pMapInfo, TreeViewItem* pParent = NULL);
    ~TreeViewItem();
public:
    //获取父项
    TreeViewItem* parent() const;
    // 获取子项
    TreeViewItem* child(int nIndex) const;
    // 增加子项
    void appendChild(TreeViewItem* pItem);
    // 获取子项个数
    int childCount() const;
    //获取子项索引
    int childIndex(const TreeViewItem* pItem) const;
    // 删除子项
    bool removeChild(int nIndex);
    // 获取列数据
    QVariant data(int nCol, int role = Qt::DisplayRole);
    // 设置列数据
    bool setData(int nCol, QVariant val, int role = Qt::EditRole);
    //行号
    int row() const;
    //树Itme项的标志
    Qt::ItemFlags flags(int nCol) const;

    //获取数据
    TreeViewDataInfo* DataInfo() const;
    //交换子项位置
    bool swapChild(int nFirst, int nSecond);

private:
    TreeViewDataInfo* m_pDataInfo;                
    TreeViewItem* m_pParent;            // 父项
    QList<TreeViewItem*> m_childItems;  // 子项集合
                                            
};

第三、model数据的实现

class ComboxTreeModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    explicit ComboxTreeModel(QObject* parent = NULL);
    ~ComboxTreeModel();
    void updataModelTree(TreeViewDataInfoList MapList);  //更新treeView中的节点信息
    TreeViewItem *getRootItem() { return m_pRootItem; };
public:
    TreeViewItem* itemFromIndex(QModelIndex index) const;  //从index 里获取具体的item信息
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const { return 1; };
    virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
    virtual QModelIndex parent(const QModelIndex &child) const;
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    virtual Qt::ItemFlags flags(const QModelIndex &index) const;
    TreeViewItem* appendItem(TreeViewDataInfo* pDataInfo, TreeViewItem* pParentItem);
    QVariant bulidData(TreeViewItem* pItem, int nCol, int role = Qt::DisplayRole) const;
private:
    TreeViewDataInfoList m_mapInfos;
    TreeViewItem* m_pRootItem;
    TreeViewDataInfo* m_pForRoot;
};

第四、窗体类

class TestDialog : public QDialog
{
    Q_OBJECT
public:
    TestDialog(QWidget* parent);
    ~TestDialog();
    void refreshModelData(TreeViewDataInfoList DataList);
    void setDefaultSelectItem(QString strItemName =QString(""));//根据显示的item去设置默认的选项
private:
    void initUI();

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值