精华内容
下载资源
问答
  • 文章目录0 背景1 代码2 sql 语句分析2.1关键词解析:2.2 全语句解释:2.3 从...于是我就决定写一下注解,方便大家理解,使用和测试的环境为Qt, 1 代码 连接数据库: #ifndef CREATECONNECTION_H #define CREATECONNEC

    0 背景

    因为实际用到递归查询数据库表中结果,本想用其他语言实现递归select操作,但是发现sql语句自身也可以进行递归查询,而且效率很高,因此就搜了相关的资料,发现网上很多的代码,但是几乎都没有注解。于是我就决定写一下注解,方便大家理解,使用和测试的环境为Qt,

    1 代码

    连接数据库:

    #ifndef CREATECONNECTION_H
    #define CREATECONNECTION_H
    
    #include<QSqlDatabase>
    #include<QCoreApplication>
    #include<QFile>
    #include<QSysInfo>
    #include<QtGlobal>
    //#include<QDebug>
    
    static bool CreateConnection(){
        //    qDebug()<<"可用驱动";
        //    QStringList drivers = QSqlDatabase::drivers();
        //    for(auto driver: drivers){
        //        qDebug()<<driver<<" ";
        //    }
        //设置数据库驱动
        QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");
    //    db1.setHostName("127.0.0.1");
    //    db1.setUserName("root");
    //    db1.setPassword("root");
    //    db1.setPort(9998);
    
        db1.setDatabaseName("/Users/mac/Qt/test/database/test.db");
    
        //打开数据库
        if(!db1.open()){
            return false;
        }
    
        return true;
    }
    
    
    
    #endif // CREATECONNECTION_H
    
    

    进行递归查询:

     //向上查询
         QSqlDatabase db = QSqlDatabase::database("connection1");
        QSqlQuery query2(db);
        QVariantList codesList;//商品编码(按照从大小排序)
        QVector<int> splitRuleVector;//拆分规则(按照从大小的拆分,例如0好对应codesList中0号和1号的拆分规则)
        
         query2.exec(QString("WITH splitInformation AS(SELECT *,0 AS rank FROM SplitRule WHERE smallCode = \'%1\' UNION ALL SELECT asr.*,info.rank+1 FROM SplitRule AS asr JOIN splitInformation AS info ON asr.smallCode = info.bigCode ) SELECT rank,bigCode,number FROM splitInformation").arg(queryCode));
              while(query2.next()){
                  //从大---->小存:递减
                  codesList.push_front(query2.value(1).toString());
                  splitRuleVector.push_front(query2.value(2).toInt());
                  //从小--->大存:递增
    //                            codesList.push_back(query2.value(1).toString());
    //                            splitRuleVector.push_back(query2.value(2).toInt());
              }
              codesList.push_back(queryCode);//放入当前查询
              //向下查询
              query2.exec(QString("WITH splitInformation AS(SELECT *,0 AS rank FROM SplitRule WHERE bigCode = \'%1\' UNION ALL SELECT asr.*,info.rank+1 FROM 、SplitRule AS asr JOIN splitInformation AS info ON asr.bigCode = info.smallCode ) SELECT rank,smallCode,number FROM splitInformation").arg(queryCode));
              while(query2.next()){
                  //从大--->小存:递减
                  codesList.push_back(query2.value(1).toString());
                  splitRuleVector.push_back(query2.value(2).toInt());
                  //从小--->大存:递增
    //                            codesList.push_front(query2.value(1).toString());
    //                            splitRuleVector.push_front(query2.value(2).toInt());
              }
    

    拆分数据表:

    大件商品编码数量小件商品编码
    a9810b92
    b925c75
    c757d64
    d647e53

    根据上面的代码:
    查询a98、d64、e53,都可以得到
    codesList:
    a98—>b92—>c75—>d64—>e53
    splitRuleVector:
    10—>5—>7—>7

    2 sql 语句分析

    查父节点:

    WITH splitInformation AS
    (SELECT *,0 AS rank FROM SplitRule WHERE smallCode = 'c75'
    UNION ALL 
    SELECT asr.*,info.rank+1 FROM SplitRule AS asr 
    JOIN splitInformation AS info ON asr.smallCode = info.bigCode ) 
    SELECT rank,bigCode,number FROM splitInformation
    

    2.1关键词解析:

    • 1, WITH AS
      作用:把查询结果作为子查询部分
    • 2,SELECT 查询的列名 FROM 表 WHERE 条件
      作用:查询符合条件的字段
      *3,原名 AS 别名
      作用:给原名取别名,如果原名不存在,则新建列,并且列名为别名
    • 4,UNION ALL
      作用:结合两个 SELECT 语句的结果,包括重复行
      区别于UNION:
      UNION:合并两个或多个 SELECT 语句的结果,不返回任何重复的行
    • 5,JOIN ON
      作用:内联
      在这里插入图片描述

    CROSS JOIN:笛卡尔积
    在这里插入图片描述
    OUTER JOIN:外联
    在这里插入图片描述
    上面三张图感谢此coroutines
    博客

    2.2 全语句解释:

    SELECT *,0 AS rank FROM SplitRule WHERE smallCode = 'c75'
    

    查询SplitRule表中smallCode 等于75 的全部信息,

    其中0 为不存在的列,因此会新建一个名为rank的列,

    SELECT asr.*,info.rank+1 FROM SplitRule AS asr 
    JOIN splitInformation AS info ON asr.smallCode = info.bigCode 
    

    查询SplitRule表(别名为asr )中全部信息和splitInformation表(别名为info)中的rank值,并对其进行加1操作, 然后把splitInformation表中的bigCode 字段等于SplitRule表中的bigCode字段的结果集合联合起来,

    WITH splitInformation AS(\* ... *\)
    

    ()中的结果集合取名为splitInformation表,对于第二个SELECT语句来说,就是调用本身

    SELECT rank,bigCode,number FROM splitInformation
    

    splitInformation表中查询rank,bigCode,number这几个字段

    第一次执行结果为:
    相当于只有第一个select语言起作用,因为splitInformation表中为空,第二个语句条件判断为假

    大件商品编码数量小件商品编码
    c757d64

    执行后splitInformation表为上面的表

    第二次执行结果为:

    大件商品编码数量小件商品编码
    c757d64
    b925c75

    也就是查询SplitRule表smallCode字段等于 splitInformation表bigCode字段的(第二条SELECT语句起作用),因此就新增了第二条记录

    执行后splitInformation表为上面的表

    第三次执行结果为:
    拆分数据表:

    大件商品编码数量小件商品编码
    a9810b92
    b925c75
    c757d64

    也就是查询SplitRule表smallCode字段等于 splitInformation表bigCode字段的,因此就新增了第三条记录

    执行后splitInformation表为上面的表

    就这样一直执行到select语句查询结果为空为止

    2.3 从任何一个节点出发查询整条链的数据

    因为如果A是顶层节点,那么SplitRule表中的bigCode字段一定有A,

    同理如果C是最底层节点,那么SplitRule表中的smallCode字段一定有C,

    如果如果B是最底层节点,那么SplitRule表中的smallCode字段bigCode字段一定有B,

    因此第一次搜索,对于第一个SELECT条件语句判断时,执行smallCode字段等于?字段的向上搜索,

    第二次搜索,对于第一个SELECT条件语句判断时,执行bigCode字段等于?字段的向下搜索,

    这样就可以包括整条链的数据。

    展开全文
  • 包括实现文件、基本配置文件、和简单的图片,使用Qt模型视图委托方法进行实现树状导航栏,重要地方都已经加了注释,可以看看我的博客里面介绍了实现
  • 树状结构显示文件夹 题目要求:编写程序,在命令行中以树状结构显示特定的文件夹及其子文件夹,如果子文件是文件则需要显示文件大小, 最后统计整个目录的大小 public class Test { static long fileNum=0; ...

    以树状结构显示文件夹


    题目要求:编写程序,在命令行中以树状结构显示特定的文件夹及其子文件夹,如果子文件是文件则需要显示文件大小, 最后统计整个目录的大小
    public class Test { 
    	static long fileNum=0; 
    	static long fileLen=0; 
    	public static void main(String[] args) { 
    		String ss="C:\\windows"; 
    		File ff=new File(ss); 
    			if(ff != null && ff.exists()){ 		
    				System.out.println(ff.getParent().getAbsolutePath()); 
    				showFile(ff,0); 
    			}
    			System.out.println(ff.getAbsolutePath()+"的文件数目为:"+fileNum+",总大小 为:"+fileLen); 
    	}
    	public static void showFile(File ff,int level) { 
    		if(ff != null) { 
    			for(int i = 0;i<level;i++) 
    				System.out.print(" "); 
    			System.out.print("|-"); 
    			if(ff.isFile()) { 
    				fileNum++; 
    				fileLen+=ff.length(); 
    				System.out.println(ff.getName()+":"+ff.length()); 
    			}else if(ff.isDirectory()) { 
    				System.out.println(ff.getName());
    				File[] fs=ff.listFiles(); 
    				for(File temp:fs)
    					showFile(temp, level+1); 
    			} 
    		} 
    	} 
    }
    
    展开全文
  • QT左右结构关联

    2021-08-04 13:44:12
    UI中设计左右结构方法一步骤1步骤2步骤3结束方法二步骤1步骤2步骤3结束 方法一 步骤1 拖动控件QListWight与stackedWidget,QListWight实现左侧导航,stackedWidget实现功能界面。 步骤2 双击QListWight控件添加菜单...

    方法一

    步骤1

    拖动控件QListWight与stackedWidget,QListWight实现左侧导航,stackedWidget实现功能界面。

    步骤2

    双击QListWight控件添加菜单,在stackedWidget中也加上不同菜单的功能。
    在这里插入图片描述
    在这里插入图片描述

    步骤3

    由QListWight发送currentRowChanged(int )信号,由stackedWidget实现setCurrentIndex(int )槽,即可实现点击菜单,右侧显示不同界面。

       connect(ui->listWidget,SIGNAL(currentRowChanged(int)),ui->stackedWidget,SLOT(setCurrentIndex(int)));
    

    结束

    最后添加不同界面的功能。
    也可以将QListWight控件嵌入到QToolBox控件中
    在这里插入图片描述

    方法二

    步骤1

    拖动控件QTreeWidget与stackedWidget,QTreeWidget实现左侧导航,stackedWidget实现功能界面。

    步骤2

    双击QTreeWidget控件添加树状菜单,在stackedWidget中也加上不同菜单的功能。
    在这里插入图片描述

    步骤3

    右击QTreeWidget控件,选择单击信号,获取点击菜单信息,设置StackedWidget控件需要显示的页面。
    在这里插入图片描述

    结束

    最后添加不同界面的功能。

    展开全文
  • QT 实现自定义树状导航栏

    千次阅读 2020-12-07 15:13:29
    Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户。这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中。 模型 - ...

    一、介绍

    |版本声明:山河君,未经博主允许,禁止转载

    1.使用技术

    Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户。这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中。
    模型 - 视图 - 控制器(MVC)是一种设计模式,由三类对象组成:

    模型:应用程序对象。

    视图:屏幕演示。

    控制器:定义了用户界面响应用户输入的方式
    在这里插入图片描述
    Qt把视图和控制器组合在一起,从而形成模型/视图结构。模型直接与数据进行通信,并为视图和委托提供访问数据的接口。

    2.效果

    展开前:
    在这里插入图片描述
    展开后:

    在这里插入图片描述

    传送门(项目源码)

    二、实现(重要代码都已加注释)

    1.CNavModel模型类

    头文件:

    #ifndef CNAVMODEL_H
    #define CNAVMODEL_H
    
    #include <QAbstractListModel>
    #include <QList>
    #include <QVector>
    
    class CNavModel : public QAbstractListModel
    {
        Q_OBJECT
    public:
        struct TreeNode
        {
            QString qsLableName;
            int nLevel;
            bool collapse;
            int nIndex;
            QList<TreeNode* > listChildren;
        };
    
        struct ListNode
        {
            QString qsLabelName;
            TreeNode* pTreeNode;
        };
    
    public:
        explicit CNavModel(QObject *parent = nullptr);
        ~CNavModel();
        int rowCount(const QModelIndex &parent = QModelIndex()) const override;
        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    
    public:
        void ReadConfig(QString qsPath);    //读取导航栏节点配置文件
        void Refresh(); //刷新模型,我这里没有用到
    
    public slots:
        void Collapse(const QModelIndex& index);    //节点展开、收缩槽函数
    
    private:
        void RefreshList();     //刷新当前界面显示的节点
    
    private:
        QVector<TreeNode*>  m_vecTreeNode;      //用于存储对应关系
        QVector<ListNode>   m_vecListNode;      //存储所有的节点
    };
    
    #endif // CNAVMODEL_H
    
    

    实现:

    #include "CNavModel.h"
    #include <QFile>
    #include <QDomDocument>
    #include <QDebug>
    
    CNavModel::CNavModel(QObject *parent)
        : QAbstractListModel(parent)
    {
    }
    
    CNavModel::~CNavModel()
    {
    
        QVector<TreeNode*>  m_vecTreeNode;      
        QVector<ListNode>   m_vecListNode;      
        for(QVector<TreeNode*>::iterator it = m_vecTreeNode.begin(); it != m_vecTreeNode.end(); it++)
        {
            if((*it)->listChildren.size())
            {
                for (QList<TreeNode*>::iterator itChild = (*it)->listChildren.begin(); itChild != (*it)->listChildren.end(); it++)
                    delete (*itChild);
            }
            delete (*it);
        }
    
        m_vecListNode.clear();
        m_vecTreeNode.clear();
    }
    
    int CNavModel::rowCount(const QModelIndex &parent) const	//返回行数
    {
        return m_vecListNode.size();
    }
    
    QVariant CNavModel::data(const QModelIndex &index, int role) const
    {
        if ( !index.isValid() )
            return QVariant();
    
        if ( index.row() >= m_vecListNode.size() || index.row() < 0 )
            return QVariant();
    
        if ( role == Qt::DisplayRole )      //显示文字
            return m_vecListNode[index.row()].qsLabelName;
        else if ( role == Qt::UserRole )    //用户定义起始位置
            return QVariant::fromValue((void*)m_vecListNode[index.row()].pTreeNode);
    
        return QVariant();
    }
    
    void CNavModel::ReadConfig(QString qsPath)
    {
        QFile xmlFile(qsPath);
        if(!xmlFile.open(QFile::ReadOnly | QFile::Text))
            return;
    
        QDomDocument docXml;
        QString error;
        if(!docXml.setContent(&xmlFile, false, &error))
        {
            xmlFile.close();
            return;
        }
    
        QDomElement xmlRoot = docXml.documentElement(); //返回根节点
        QDomNode domNode = xmlRoot.firstChild(); //获取子节点,一级节点
        while (!domNode.isNull())
        {
            if(domNode.isElement())
            {
                QDomElement domElement = domNode.toElement();   //一级节点
                TreeNode* pTreeNode = new TreeNode;
    
                pTreeNode->qsLableName = domElement.attribute("lable");//获取一级节点的lable
                pTreeNode->nLevel = 1;  //标志一级节点
                pTreeNode->collapse =  domElement.attribute("collapse").toInt(); //标志是否展开
                pTreeNode->nIndex = domElement.attribute("index").toInt();  //获取标志
    
                QDomNodeList list = domElement.childNodes();    //获取二级节点
                for(int i = 0; i < list.count(); i++)
                {
                    QDomElement secNodeInfo = list.at(i).toElement();
                    TreeNode* pSecNode = new TreeNode;
                    pSecNode->qsLableName = secNodeInfo.attribute("lable");
                    pSecNode->nLevel = 2;
                    pSecNode->nIndex = secNodeInfo.attribute("index").toInt();
                    pTreeNode->collapse = false;
                    pTreeNode->listChildren.push_back(pSecNode);
                }
                m_vecTreeNode.push_back(pTreeNode);
            }
            domNode = domNode.nextSibling();    //下一一级节点
        }
    
        xmlFile.close();
        RefreshList();  //刷新界面标题栏展示数据
        beginInsertRows(QModelIndex(), 0, m_vecListNode.size());    //插入所有节点
        endInsertRows(); //结束插入
    }
    
    void CNavModel::RefreshList()
    {
        m_vecListNode.clear();
        for(QVector<TreeNode*>::iterator it = m_vecTreeNode.begin(); it != m_vecTreeNode.end(); it++)
        {
            //一级节点
            ListNode node;
            node.qsLabelName = (*it)->qsLableName;
            node.pTreeNode = *it;
            m_vecListNode.push_back(node);
    
            if(!(*it)->collapse) //如果一级节点未展开,则插入下一一级节点
                continue;
    
            for(QList<TreeNode*>::iterator child = (*it)->listChildren.begin(); child != (*it)->listChildren.end(); child++)
            {
                ListNode node;
                node.qsLabelName = (*child)->qsLableName;
                node.pTreeNode = *child;
                m_vecListNode.push_back(node);
            }
        }
    }
    
    void CNavModel::Collapse(const QModelIndex& index)
    {
        TreeNode* pTreeNode = m_vecListNode[index.row()].pTreeNode; //获取当前点击节点
        if(pTreeNode->listChildren.size() == 0) //如果该节点没有子节点 则返回
            return;
    
        pTreeNode->collapse = !pTreeNode->collapse; //刷新是否展开标志
    
        if(!pTreeNode->collapse)    //如果是不展开,即为展开变成合并,移除合并的
        {
            beginRemoveRows(QModelIndex(), index.row() + 1, pTreeNode->listChildren.size()); //默认起始节点为最初节点
            endRemoveRows();
        }
        else {
            beginInsertRows(QModelIndex(), index.row() + 1, pTreeNode->listChildren.size());
            endInsertRows();
        }
        RefreshList(); //更新界面显示节点数据
    }
    
    void CNavModel::Refresh()
    {
        RefreshList();
        beginResetModel();
        endResetModel();
    }
    
    

    2.视图类源码

    这里采用的是QListView视图进行列表显示,用户可以进行自行更改视图样式
    头文件

    #ifndef CNAVVIEW_H
    #define CNAVVIEW_H
    
    #include <QObject>
    #include <QListView>
    
    class CNavView : public QListView
    {
        Q_OBJECT
    
    public:
        CNavView(QWidget *parent);
        ~CNavView();
    };
    
    #endif // CNAVVIEW_H
    
    

    实现:这里只修改了背景色等

    #include "CNavView.h"
    #include <QColor>
    
    CNavView::CNavView(QWidget *parent) : QListView (parent)
    {
        setStyleSheet(
            QString(
            "QListView{background-color:%1;"
            "border:0px solid %2;"
            "border-right-width:1px;}")
            .arg("239, 241, 250")
            .arg("214, 216, 224"));
    }
    
    CNavView::~CNavView()
    {
    
    }
    
    

    3.委托(重要)

    引入委托的目的:项目数据显示和自定义编辑。
    头文件:

    #ifndef CNAVDELEGATE_H
    #define CNAVDELEGATE_H
    
    #include <QObject>
    #include <QStyledItemDelegate>
    
    class CNavDelegate : public QStyledItemDelegate
    {
        Q_OBJECT
    public:
        CNavDelegate(QObject* parent);
        ~CNavDelegate();
    
    public:
        QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
        void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    
        void SetPending(bool pending) { m_pending = pending; }
    
    private:
        QString GetImagePath(int nIndex) const;
    
    private:
        bool m_pending;
    };
    
    #endif // CNAVDELEGATE_H
    
    

    实现:

    #include "CNavDelegate.h"
    #include "CNavModel.h"
    #include <QPainter>
    #include <QColor>
    
    CNavDelegate::CNavDelegate(QObject *parent)
        :QStyledItemDelegate(parent)
        , m_pending(false)
    {
    
    }
    
    CNavDelegate::~CNavDelegate()
    {
    
    }
    
    QSize CNavDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        CNavModel::TreeNode* pTreeNode = (CNavModel::TreeNode*)index.data(Qt::UserRole).value<void*>();
        if(pTreeNode->nLevel == 1)
            return QSize(50, 45);
        else
            return QSize(50, 28);
    }
    
    void CNavDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        CNavModel::TreeNode* pTreeNode = (CNavModel::TreeNode*)index.data(Qt::UserRole).value<void*>();
        painter->setRenderHint(QPainter::Antialiasing); //防走样
    
        //根据绘制时提供的信息进行背景色绘制
        if ( option.state & QStyle::State_Selected )
        {
            painter->fillRect(option.rect, QColor(133, 153, 216));
        }
        else if ( option.state & QStyle::State_MouseOver )
        {
            painter->fillRect(option.rect, QColor(209, 216, 240));
        }
        else
        {
            if ( pTreeNode->nLevel == 1 )
                painter->fillRect(option.rect, QColor(247, 249, 255));
            else
                painter->fillRect(option.rect, QColor(239, 241, 250));
        }
    
        //添加图片
        if(pTreeNode->listChildren.size() != 0)
        {
            QString qsImagePath;
            if(!pTreeNode->collapse)
            {
                if ( option.state & QStyle::State_Selected )
                    qsImagePath = ":/image/unexpand_selected.png";
                else
                    qsImagePath = ":/image/unexpand_normal.png";
            }
            else {
                if ( option.state & QStyle::State_Selected )
                    qsImagePath = ":/image/expand_selected.png";
                else
                    qsImagePath = ":/image/expand_normal.png";
            }
    
            //设置图片大小
            QPixmap img(qsImagePath);
            QRect targetRect = option.rect;
            targetRect.setWidth(16);
            targetRect.setHeight(16);
    
            //设置图片坐标
            QPoint c = option.rect.center();
            c.setX(8);
            targetRect.moveCenter(c);
    
            //将图片放到对应位置
            painter->drawPixmap(targetRect, qsImagePath, img.rect());
        }
        else {
            QString qsPath = GetImagePath(pTreeNode->nIndex);
            if(qsPath.size())
            {
                QPixmap img(qsPath);
                QRect targetRect = option.rect;
                targetRect.setWidth(16);
                targetRect.setHeight(16);
    
                //设置图片坐标
                QPoint c = option.rect.center();
                c.setX(12);
                targetRect.moveCenter(c);
    
                //将图片放到对应位置
                painter->drawPixmap(targetRect, qsPath, img.rect());
            }
        }
    
        //添加文字
        QPen textPen( option.state & QStyle::State_Selected ? QColor(255, 255, 255) : QColor(58, 58, 58));
        painter->setPen(textPen);
    
        int margin = 25;
    
        if ( pTreeNode->nLevel == 2 )
            margin = 45;
    
        QRect rect = option.rect;
        rect.setWidth(rect.width() - margin);
        rect.setX(rect.x() + margin);
    
        QFont normalFont("Microsoft Yahei", 9);
        painter->setFont(normalFont);
        painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, index.data(Qt::DisplayRole).toString() );
    
        //在每一行下方划线
        QPen linePen(QColor(214, 216, 224));
        linePen.setWidth(1);
        painter->setPen(linePen);
    
        if ( pTreeNode->nLevel == 1
            || (pTreeNode->nLevel == 2 ) )
        {
            painter->drawLine(
                QPointF(option.rect.x(), option.rect.y()+option.rect.height()-1),
                QPointF(option.rect.x() + option.rect.width(), option.rect.y()+option.rect.height()-1));
        }
    }
    
    QString CNavDelegate::GetImagePath(int nIndex) const
    {
        switch (nIndex)
        {
        case 1:
            return QString();
        case 13:
            return QString(":/image/Purchase.png");
        case 16:
            return QString(":/image/Tasklist.png");
        case 17:
            return QString(":/image/Trendchart.png");
        default:
            return QString();
        }
    }
    
    

    4.使用:

    void CMainFrm::SetNavigationBar()
    {
        CNavModel* pNavModel = new CNavModel(this);
        CNavDelegate* pDelegate = new CNavDelegate(this);
        pNavModel->ReadConfig(QCoreApplication::applicationDirPath() += "/config/navigation.xml");
        ui->listView->setModel(pNavModel);
        ui->listView->setItemDelegate(pDelegate);
        connect(ui->listView, SIGNAL(doubleClicked(const QModelIndex &)), pNavModel, SLOT(Collapse(const QModelIndex &)));
    }
    

    项目源码:

    传送门
    如果对您有所帮助,还请帮忙点个赞

    展开全文
  • Qt之实现自定义树状图控件

    千次阅读 2019-08-09 17:38:21
    <QtWidgets/QWidget> # include # include # include # include # include # include # include # include # define ITEM_HEIGHT 40 // item高度; // 传感器数据...
  • 树状结构的建立 1 import tkinter 2 from tkinter import ttk 3 4 wuya = tkinter.Tk() 5 wuya.title("wuya") 6 wuya.geometry("300x400+10+20") 7 8 # 创建树状对象 9 tree = ttk.Treeview...
  • qtcreator不能显示文件树状

    千次阅读 2017-10-14 19:16:51
    新建ros的workspace后,src一直没有跳出来,自然也没地方点击可以添加package,最后还是张老板装了一个中文版的qt creator然后发现漏斗这里还有一个简化树形图显示的选项。。。。太折磨人了。 这是文件树状图显示图...
  • Qt树形结构的拖拽

    千次阅读 2018-01-24 15:29:18
    记录下最近处理Qt树形结构的过程 由于对于树形机构item的处理较为复杂,因此采用QTreeView来制作树形结构。 对于事件和界面的绘制主要在delegate中完成,由于实现setStyleSheet,所以delegate继承了...
  • QT结构树界面设计,一级部门,二级部门,人员等;简简单单,图片路径和格式改动了一下,可以根据需求自己修改。
  • 最近碰到一个项目,开发环境被限定为QT,我想问下有没有现成插件展现树形结构,要求就是能在一个屏幕下展现中心服务器–站级服务器–单机的各种监控信息,比如说把鼠标放在中心服务器的图标上,可以显示中心服务器的...
  • QTreeWidget Qt最常用最好用的树状列表窗体

    万次阅读 多人点赞 2017-05-03 00:48:57
    多级树状图,其实也很好理解,就是把父节点换掉嘛,谁是父节点,那么Item项就挂载在谁的下面。 QTreeWidgetItem *items3 = new QTreeWidgetItem(tree, QStringList(QString( "num_13" ))); QTreeWidget...
  • 学习QStandardItem 需要先了解qt Model/View(模型/视图)结构,用界面组件显示与编辑数据的一种结构。 视图(View):显示和编辑数据的界面组件,如 QListView、QTreeView 和 QTableView 模型(Model):视图与...
  • Qt QTreeWidget 树形结构实现(一)

    千次阅读 2012-08-01 15:12:17
    Qt中实现树形结构可以使用QTreeWidget类,也可以使用QTreeView类,QTreeWidget继承自QTreeView类。树形效果如下图所示: 这是怎么实现的呢?还有点击节点时会有相应的事件响应。 1. 树形结构实现 QT GUI中有...
  • Qt Assistant 介绍

    万次阅读 多人点赞 2015-12-06 19:26:44
    Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具。简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 文件菜单 编辑菜单 查看菜单 前往菜单 书签菜单 ...
  • Qt中的 Model/View 结构

    2021-06-08 10:44:00
    Qt中的 Model/View 结构 源数据由模型 (Model) 读取,然后在视图 (View) 组件上显示和编辑,在界面上编辑修改的数据又通过模型保存到源数据。Model/View 结构将数据模型和用户界面分离开来,分别用不同的实现,是一...
  • Qt使用的QTreeView对象实现树状链表简单显示。

    万次阅读 多人点赞 2018-08-11 16:19:47
    本人目的是为了实现一个显示网络数状拓扑结构图,简单的说就是实现树形结构链表,对比二叉树,我们知道二叉树中一个节点的最近子节点只有两个,一个左孩子和一个右孩子。但是本人的需求是每个节点都能有0个或0个以上...
  • Qt QTreeWidget 树形结构实现

    千次阅读 2015-08-24 19:01:54
    Qt中实现树形结构可以使用QTreeWidget类,也可以使用QTreeView类,QTreeWidget继承自QTreeView类。树形效果如下图所示: 这是怎么实现的呢?还有点击节点时会有相应的事件响应。 1. 树形结构实现 QT GUI中有...
  • 这是我想说的第一个帮助文档,这个SelectionMode关键词定义了在该视图下的模式,有五种模式,五种模式如下,有兴趣可以去Qt中学习学习。 主要的两个功能见表格所展示的,在下文程序示例主要运用第二个函数,来设置...
  • QT之树形结构显示说明

    千次阅读 2018-01-14 18:18:45
    一、Qt中QTreeView往往不是单一的树形结构,而是复杂的多级结构。现在以一个复杂的树形数据结构为例,说明QTreeView是怎么显示的。 二、数据结构如图所示: (1)虚线1号表示无效的根节点。 (2)每个节点都有...
  • 第一种,直接用QTreeWidget,这种情况用到QDir类,用递归实现,代码如下 void LoadFiles(QString path, QTreeWidget *treewidget, QTreeWidgetItem *item){ QDir dir(path); if (!dir.exists()) return;...
  • Qt QTreeWidget树形结构

    2015-12-08 12:43:06
    示例: QStringList messageLabels; messageLabels tr ( "Subject" ) tr ( "Sender" ..."Grace K...."Grace K....https://github.com/ljcduo/c-gui-programming-with-qt-4/tree/master/chap06/findfile3
  • Qt 之 XML

    万次阅读 2016-10-13 13:53:41
    简述XML 指可扩展标记语言(eXtensible Markup Language),是一种用于记录多种数据类型的标记语言。使用 XML 可以将各类型的文档定义为容易读取的格式,便于用户读取。而且,在应用程序中使用 XML,...Qt XML C类 更多
  • ClassQAbstractItemModel:使用QML的TreeView类来展示树状结构,对应的是QT的Model/View模型。这个model是一个数据模型,要为TreeView提供一个模型,需要定义一个类,该类需要继承自calssQAbstractItemModel,不能...
  • Qt绘制二叉树

    千次阅读 2020-03-02 23:17:36
    Qt绘制二叉树是大二时数据结构的一个实习题目,当时的功能要求如下: 键盘输入二叉树结点序列(前序或层次),创建一棵二叉树 实现SwapTree方法,以根结点为参数,交换每个结点的左子树和右子树(提示:前序递归) ...
  • Model/View(模型/视图)结构Qt中用界面组件显示与编辑数据的一种结构,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与原始数据之间的接口。 GUI 应用程序的一个很重要的功能是由用户在界面上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,223
精华内容 489
关键字:

qt树状结构