【转】QT中树控件QTreeView开发实例(有改动)

原文地址:http://mobile.51cto.com/symbian-268700.htm

注:这里做了些许改动,内容等方面并无影响。

本文讲解了QT中树控件QTreeView开发实例,对于QTreeView没有过多的讲解,那么不说废话了,看代码是如何实现的吧。

方法一:使用QDirModel进行目录的现实,QDirModel是QT中专为文件目录树型显示所提供的一种model。 具体使用如下:

#include <QApplication>
#include <QTextCodec>
#include <QSplitter>
#include <QDirModel>
#include <QTreeView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));

    QSplitter *splitter = new QSplitter;
    QDirModel *model = new QDirModel;

    // 从缺省目录创建数据
    /* 配置一个view去显示model中的数据,只需要简单地调用setModel(),并把目录model作为参数传递
       setRootIndex()告诉views显示哪个目录的信息,这需要提供一个model index,然后用这个index去model中获取数据
       index()这个函数是QDirModel特有的,通过把一个目录作为参数,得到了需要的model index
       其他的代码只是窗口show出来,然后进入程序的事件循环*/
    QTreeView *tree = new QTreeView(splitter);
    tree->setModel(model);
    tree->setRootIndex(model->index("C:\\"));

    splitter->setWindowTitle("目录");
    splitter->setGeometry(100,100,450,200);
    splitter->show();

    return a.exec();
}
显示结果如下所示:

方法二:自行设置树型结构。

treeview.h

#ifndef TREEVIEW_H
#define TREEVIEW_H

#include <QTreeView>
#include <QList>
#include <QStandardItem>
#include <QMouseEvent>

class TreeView : public QTreeView
{
    Q_OBJECT
public:
    explicit TreeView(QWidget *parent = 0);
    void iteratorOverItems();
    QList<QStandardItem *> returnTheItems();
    void mouseDoubleClickEvent(QMouseEvent *event);
    
signals:
    
public slots:
    
private:
    QStandardItemModel *model;
};

#endif // TREEVIEW_H
treeview.cpp

#include "treeview.h"
#include <QModelIndex>
#include <QDebug>

TreeView::TreeView(QWidget *parent) :
    QTreeView(parent)
{
    model = new QStandardItemModel(4, 2);
    model->setHeaderData(0, Qt::Horizontal, "Service");
    model->setHeaderData(1, Qt::Horizontal, "Details");

    QStandardItem *item1 = new QStandardItem("avahi-daemon");
    item1->setIcon(QIcon(":/btn_bright_01"));
    QStandardItem *item2 = new QStandardItem("bluetooth");
    item2->setIcon(QIcon(":/btn_bright_02"));
    QStandardItem *item3 = new QStandardItem("crond");
    item3->setIcon(QIcon(":/btn_bright_03"));
    QStandardItem *item4 = new QStandardItem("cups");
    item4->setIcon(QIcon(":/btn_bright_04"));

    model->setItem(0, 0, item1);
    model->setItem(1, 0, item2);
    model->setItem(2, 0, item3);
    model->setItem(3, 0, item4);

    QStandardItem *item5 = new QStandardItem("fifth");
    item4->appendRow(item5);

    QModelIndex myparent;
    for (int i=0; i<4; i++)
    {
        myparent = model->index(0, 0, myparent);
        model->insertRows(0, 1, myparent);  // 添加一行
        model->insertColumns(0, 1, myparent);   // 添加一列
        QModelIndex index = model->index(0, 0, myparent);
        model->setData(index, i);
    }

    this->setModel(model);
}

// 输出所有单元格的内容
void TreeView::iteratorOverItems()
{
    QList<QStandardItem *> list = this->returnTheItems();
    foreach (QStandardItem *item, list)
    {
        qDebug()<<item->text();
    }
}

// 获取所有单元格
QList<QStandardItem *> TreeView::returnTheItems()
{
    return model->findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
}

// 鼠标双击事件(输出被双击item的文本)
void TreeView::mouseDoubleClickEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        QModelIndex index = currentIndex();
        qDebug()<<index.data().toString();
    }
}
main.cpp

#include <QApplication>
#include "treeview.h"
#include <QAbstractItemView>
#include <QHeaderView>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));

    TreeView view;
    view.setEditTriggers(QAbstractItemView::NoEditTriggers);
    view.header()->setResizeMode(QHeaderView::ResizeToContents);
    view.resize(300,280);
    view.iteratorOverItems();
    view.setWindowTitle("Linux 服务管理");
    view.show();

    return a.exec();
}
显示:



  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值