QTreeView

Qt QTreeView简单使用 QTreeView: 用于显示树状结构数据,适用于树状结构数据的操作。 阅读详情

QTreeView

QTreeView和QTableView有些相似,只是数据有点不一样

初始化:

    {
        d_tree_view = new QTreeView();
        d_tree_view->setAnimated(true);
        d_tree_view->setExpandsOnDoubleClick(true);
        d_tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
        d_tree_view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

        d_model = new PCModel();
        d_tree_view->setModel(d_model);

        layout_root->addWidget(d_tree_view);
    }

// 习惯上连上一些槽函数,去操作QTreeView
// 比如点击、双击、右键菜单


    connect(d_tree_view, SIGNAL(clicked(QModelIndex)), this, SLOT(slot_select_sw(QModelIndex)) );
    connect(d_tree_view, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slot_show_sw(QModelIndex)) );
    connect(d_tree_view, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slot_show_context_menu(QPoint)) );

Item数据,主要是父子节点

PCItem .h

#ifndef PCITEM_H
#define PCITEM_H

#include <QObject>
#include <QVector>
#include <QDebug>

class PCItem : public QObject
{
    Q_OBJECT
public:
    explicit PCItem(QObject* parent = 0);
    ~PCItem();

    int get_id() const;
    
    void clear();

    bool delete_item(PCItem* item);


public:
    int get_index(PCItem* item);


private:
    int d_id;

public:
    PCItem* d_parent;
    // children
    QVector<PCItem*> d_children;

public:
    QString d_name;

	QString d_age;

};

#endif // PCITEM_H

PCItem .cpp

#include "PCItem.h"
#include "coreutil/IdUtil.h"

#include <QDir>
#include <QDateTime>
#include <QFileInfo>

#include <iostream>

PCItem::PCItem(QObject* parent)
    : QObject(parent),
      d_parent(0),
      d_children(QVector<PCItem*>())
{
    d_id = IdUtil::get_id();
}



PCItem::~PCItem()
{
    QVector<PCItem*>::iterator begin = d_children.begin();
    QVector<PCItem*>::iterator end = d_children.end();
    while(begin != end) {
        delete *begin;
        *begin = 0;
        ++begin;
    }
}



int
PCItem::get_id() const
{
    return d_id;
}


void
PCItem::clear()
{

}


void
PCItem::clear_read_info()
{

}

Model

PCModel.h


#ifndef PCMODEL_H
#define PCMODEL_H

#include <QAbstractItemModel>



class PCItem;

/**
 * 
 */
class PCModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    PCModel(QObject* parent = 0);
    ~PCModel();

    PCItem* get_item();

    void clear_all_info();

    void refresh_table();


public:
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;

    QModelIndex parent(const QModelIndex& child) const;

    QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const;

    int rowCount(const QModelIndex& parent = QModelIndex()) const;
    int columnCount(const QModelIndex& parent = QModelIndex()) const;
    bool hasChildren(const QModelIndex &parent = QModelIndex()) const;//

    QVariant data(const QModelIndex& idx, int role = Qt::DisplayRole) const;

    Qt::ItemFlags flags(const QModelIndex& idx) const;

    // when QCheckBox need(reference)
    //bool setData(const QModelIndex& idx, const QVariant& value, int role = Qt::EditRole);




private:
    PCItem* d_item_root;



};

#endif // PCMODEL_H

PCModel.cpp

#include "PCModel.h"
#include "PCItem.h"
#include "enum/GlobalAction.h"
#include "validvalue/FileUtil.h"

#include <QMessageBox>
#include <QFileInfo>
#include <QApplication>

#include <QStyle>
#include <QDebug>


using namespace GlobalAction;




PCModel::PCModel(QObject* parent)
    : QAbstractItemModel(parent),
      d_item_root(new PCItem())
{
}



PCModel::~PCModel()
{
    //qDebug() << __FILE__ << __LINE__ << " ~PCModel ";

    if( d_item_root )
    {
        d_item_root->deleteLater();
        d_item_root = 0;
    }
}



PCItem*
PCModel::get_item()
{
    return d_item_root;
}



void
PCModel::clear_all_info()
{
    beginResetModel();
    d_item_root->clear();
    endResetModel();
}


void
PCModel::refresh_table()
{
    beginResetModel();

    endResetModel();
}



QVariant
PCModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    Q_UNUSED(orientation);
    if( role == Qt::DisplayRole )
    {
        switch(section){
        case 0:
            return tr("你的头部标题名称");
        default:
            break;
        }
    }
    return QVariant();
}



int
PCModel::rowCount(const QModelIndex& parent) const
{
    if( parent.isValid() )
    {
        PCItem* item = (PCItem*)parent.internalPointer();
        //qDebug() << __FILE__ << __LINE__ << " rowCount  isValid " << item->d_children.size();
        return item->d_children.size();
    }
    else
    {
        return d_item_root->d_children.size();
    }

    return 0;
}



int
PCModel::columnCount(const QModelIndex& parent) const
{
    Q_UNUSED(parent);
    return 1;
}



QModelIndex
PCModel::parent(const QModelIndex& child) const
{
    if( !child.isValid() || !child.internalPointer() )
    {
        return QModelIndex();
    }

    PCItem* item = (PCItem*)child.internalPointer();

    //qDebug() << __FILE__ << __LINE__ << " item = " << item;
    PCItem* item_parent = item->d_parent;
    if( item_parent )
    {
        PCItem* item_parent_p = item_parent->d_parent;
        if( item_parent_p )
        {
            //const int& idx = item_parent_p->d_children.indexOf(item_parent);
            const int& idx = item_parent_p->get_index(item_parent);
            if( -1 != idx )
            {
                return createIndex(idx, 0, item_parent);
            }
        }
    }

    return QModelIndex();
}



QModelIndex
PCModel::index(int row, int column, const QModelIndex& parent) const
{
    if( parent.isValid() )
    {
        PCItem* item = (PCItem*)parent.internalPointer();
        //qDebug() << __FILE__ << __LINE__ << " row = " << row;
        if( row > -1 && row < item->d_children.size() )
        {
            if( item->d_children.at(row)->d_is_show_name )
            {
                return createIndex(row, column, item->d_children.at(row));
            }
        }
    }
    else
    {
        if( row > -1 && row < d_item_root->d_children.size() )
        {
            return createIndex(row, column, d_item_root->d_children.at(row));
        }
    }

    return QModelIndex();
}



bool
PCModel::hasChildren(const QModelIndex& idx) const
{
    if( !idx.isValid() )
    {
        return true;
    }

    //qDebug() << __FILE__ << __LINE__ << " idx = " << idx;
    PCItem* item = (PCItem*)idx.internalPointer();
    if( item && item->d_children.size() > 0 )
    {
        return true;
    }

    return false;
}



Qt::ItemFlags
PCModel::flags(const QModelIndex& idx) const
{
    return QAbstractItemModel::flags(idx);
}



QVariant
PCModel::data(const QModelIndex& idx, int role) const
{
    if( !idx.isValid() )
    {
        return QVariant();
    }

    PCItem* item = (PCItem*)idx.internalPointer();

    if( role == Qt::DecorationRole )
    {
		// 图标
        //qApp->style()->standardIcon()
        return QIcon(FileUtil::get_icon_name_from_name(item->d_name));
    }

    if( role == Qt::DisplayRole || role == Qt::EditRole )
    {
        switch( idx.column() ) {
        case 0:
        {
             return item->d_name;
            
        }
        default:
            qWarning("data: invalid display value column %d", idx.column());
            return QVariant();
        }
    }

    if( role == Qt::UserRole )
    {
        //qDebug() << __FILE__ << __LINE__ << " UserRole";
        //return "UserRole";
    }

    return QVariant();
}



//bool
//PCModel::setData(const QModelIndex& idx, const QVariant& value, int role)
//{
//    if( !idx.isValid() )
//    {
//        return false;
//    }

//    if( role == Qt::UserRole )
//    {
// TODO

//        emit dataChanged(idx, idx); // to refresh QCheckBox
//        return true;
//    }

//    return false;
//}


QT入门Item Views之QTreeView qt控件 阅读详情

相关推荐

Qt QTreeView 详解

一.常见接口使用 1.设置表头隐藏,设置表头 QStandardItemModel *model = new QStandardItemModel(this); //设置表头隐藏 //ui->treeView->setHeaderHidden(true); //设置表头 model->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄"); //设置model ui->tr

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 3万+

Qt TreeView 获取点击事件及内容

在这个例子中,我们创建了一个自定义的QTreeView类,并重写了它的构造函数。我们还将它的选择模式设置为单选模式。然后,我们连接clicked信号到on_clicked函数,以便在用户单击TreeView的项目时调用该函数。最后,在on_clicked函数中,我们使用QModelIndex的data()方法来获取所选项的文本,并打印出它的索引和文本。当用户单击Tree View中的项时,将触发clicked信号并发送包含所单击项的模型索引的参数。

QtCompany的博客 3500

QTreeView使用整理

Model/View架构分为三部分:模型、视图和委托。主要目的是将数据的存储与显示分离。Model模型:对外提供标准接口存取数据,不关心数据如何显示。View视图:自定义数据的显示方式,不关心数据如何组织存储。Delegate委托:在视图的基础上可以自定义特殊的显示和编辑效果。一般只有Model与内存上的原始数据打交道,通过原始数据构造一个Model,然后View从Model取数据进行展示。

qq_31286321的博客 4435

QTreeView使用总结6,单击双击的信号与事件

1,简介上文介绍了选中信号的处理,本文继续介绍QTreeView的操作处理。单击、双击的信号槽的写法,以及重写鼠标操作事件的一般方法。2,单机双击信号响应在QTreeView的父类QAbstractItemView内,定义了这一类视图控件的常用信号:QAbstractItemView.h:Q_SIGNALS: void pressed(const QModelIndex &amp;inde...

逆枫 -- C++/Qt工程师、创业者 2万+

【Qt笔记】QTreeView控件详解

QTreeView是Qt框架中一个非常重要的控件,用于展示和操作层次化或树形结构的数据。它基于模型/视图架构,通过与数据模型的结合,实现了数据的灵活展示和用户交互。

qq_52924376的博客 7904

PyQt5 QTreeView树图

QTreeWidget QTreeWidget 是继承了QTreeView 常用方法: 树形结构是通过QTreeWidget和QTreeWidgetItem类实现的: 代码: # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class TreeWidgetDemo(QMainWindow..

比卡丘不皮的博客 7535

QTreeView使用系列教程目录

写这篇文章的目的是为了,让大家很容易上手进行QTreeView的开发,所以会先讲下原理,让大家大概明白了,再进行实操。 网上很多讲QTreeView+model开发方式的文章,一上来,就是一堆代码,可能对初学者不是很好入手。 介于这块知识较多,所以打算出个系列,详细讲解一下各方面的使用。 1、《Qt之Model/View框架介绍》:系列教程之一 2、《QTreeView+QDirModel...

百里杨的博客 1万+

QTreeview实现搜索功能查找功能

QTreeview查找功能的需求: 1.搜索某个节点时,该节点的父节点和子节点都显示出来 效果图如下: 输入搜索内容后: 核心代码如下: bool TableViewSortFilterModelBase::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { ...

liuguangzhou123的专栏 7347

QTreeView使用总结--序

在Qt开发过程中,我发现树控件即QTreeView使用的非常频繁。 各种批量展示和编辑信息的地方,都用得上该控件。 我的项目在使用QTreeView过程中,用到了各种常规、不常规的功能,并进行过各种改造。 这里将这些知识与技巧作一个总结,分享给大家。

逆枫 -- C++/Qt工程师、创业者 2万+

PyQt4 QTreeView的简单树

简单的树结构,目前的残留问题是无法自动调整QTreeView的宽度 1、新建文件夹,任意英文名字,比如Main 创建py文件,内容如下: # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'GUI.ui' # # Created: Mon Jan 08 19:54:27 2018 #

yangyang022的博客 2875

QTreeView冻结列(QTreeView第一列不随滑块移动)

自16年参加工作至今,遇到过各种各样的问题和困难。在不断的磨炼中,自己也取得了长足的进步。在此,感谢在生活和工作中给予我关怀和帮助的兄弟们。该文章是本人首次撰写博客,工作中,由于要写一个关于QTreeView的冻结列,当时查阅资料时不得不说资料甚少,无意中看到一个论坛中提到Qt自带例子中有一个QTableWidget冻结列的例子,通过参考该例子,自己也写了此段代码,希望能够帮到各位需要的看官,望各位看官给予指点。

yuyuepingfan的博客 3122

QTreeView复选框的实现

QTreeView复选框的实现

weixin_42219627的博客 6616

Qt树形控件QTreeView使用详细说明

Qt提供了树形控件,当需要动态选择相应的信息展示时,可以用树形控件。 例如,下面的demo效果: 继承关系 class Q_WIDGETS_EXPORT QTreeView : public QAbstractItemView 点击树形节点,如何获得点击节点的信息呢, 查看QTreeView的头文件,该类好像没...

琅嬛福地 1万+

QTreeView的拖拽功能

QTreeView的拖拽功能Qt树形结构的拖拽功能(drag/drop)在这里插入图片描述效果图树形Model的定义树形Model的实现界面设置拖放界面的头文件拖放界面的实现源代码连接 Qt树形结构的拖拽功能(drag/drop) 效果图 树形Model的定义 class TreeNode { public: TreeNode(const QString& text = “”) :mTex...

u013125105的博客 1万+

Qt 之 QSS(QTreeView)

QTreeView 作为一个树形控件,我们经常用到,只要对样式熟悉,可以做出特别漂亮的特效。

青春不老,奋斗不止! 2万+

Qt QTreeView使用-QStandardItemModel的使用

代码里面有tree view的节点操作,包括添加,当前点击检查,遍历等。具体介绍见: Qt树形控件QTreeView使用1——节点的添加删除操作: http://blog.youkuaiyun.com/czyt1988/article/details/18996407 Qt树形控件QTreeView使用2——复选框的设置: http://blog.youkuaiyun.com/czyt1988/article/details/19171727 利用C++11的function和bind功能,实现QStandardItemModel的通用遍历函数: http://blog.youkuaiyun.com/czyt1988/article/details/21093451

QTreeView与QFileSystemModel

这个类提供对本地文件系统的访问,提供重命名、删除文件和目录以及创建新目录的功能。在最简单的情况下,它可以与合适的显示控件一起使用,作为浏览器或过滤器的一部分。可以给视图提供有关其处理的数据的提示,以提高在显示大量项目时的性能。实现了来自模型的项目的树形表示。默认情况下,树视图中的所有列都是可移动的,除了第一列。提供的标准接口进行访问,但它还提供了一些特定于目录模型的便利函数。类提供,但使用了 Qt 的模型/视图架构提供的更灵活的方法。函数提供有关模型中项目相关的底层文件和目录的信息。

charlie114514191的博客 1317

SAR学习笔记后续-phased工具箱介绍

摘要:相控阵雷达介绍,基于仿真对MATLAB中phased工具箱进行了详细介绍

yjh_2019的博客 1万+
上一篇: Qt中使用sqlite3.h小工具类
下一篇: pcl opencv中flann冲突
问童子
博客等级 码龄11年 50粉丝 93原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值