您的位置:首页 > 编程语言 > Qt开发

Qt:在TreeModel+QTreeView中使用复选框(checkbox)

2012-04-27 20:59 537 查看
参考链接:
1. Qt:在TreeModel+QTreeView中使用复选框(checkbox)
http://blog.csdn.net/vah101/article/details/6190809
2. QTreeView Checkboxes
http://stackoverflow.com/questions/8175122/qtreeview-checkboxes

参考链接1实现了基本功能,但在后期进行拓展的时候并不方便,比如说要默认情况下所有节点以选中,参考链接1提供的程序并不好修改。
参考链接2通过对TreeItem结构添加一个boolchecked来变量保存节点的状态(参考链接1中通过TreeModel中的成员变量QList<QPersistentModelIndex>
m_checkedList来保存"已选择"节点),不失为一个好办法,也方便后期的拓展。

在参考链接的基础上,对程序的功能进行了拓展,添加了一个"click me"按钮用于获取已选节点的内容,截图效果如下:





可以看到,运行结果与预期一致。

项目源码:
http://download.csdn.net/detail/ajaxhe/4262184

部分源码:
这里就以QT附带的simpletreemodel项目为例,说明一下其用法。simpletreemodel项目的路径通常在qt目录的example目录的itemviews目录下,例如,我的就在C:\Qt\4.8.0\examples\itemviews\simpletreemodel里。
treemodel.cpp

[align=left]bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role)[/align]
[align=left]{[/align]
[align=left]      if (role==Qt::CheckStateRole && index.column()==0)[/align]
[align=left]      {[/align]
[align=left]            TreeItem *item = static_cast<TreeItem*>(index.internalPointer());[/align]
[align=left]            if (value==Qt::Unchecked)[/align]
[align=left]            {[/align]
[align=left]                  //m_checkedList.removeOne(index);[/align]
[align=left]                  item->setCheckState(false);[/align]
[align=left]                  emit(dataChanged(index, index));[/align]
[align=left]            }[/align]
[align=left]            else if(value==Qt::Checked)[/align]
[align=left]            {[/align]
[align=left]                  //m_checkedList.append(index);[/align]
[align=left]                  item->setCheckState(true);[/align]
[align=left]                  emit(dataChanged(index, index));[/align]
[align=left]            }[/align]
[align=left]            int childCount = rowCount(index);[/align]
            if (childCount >
0)
[align=left]            {[/align]
[align=left]                  //判断是否有子节点[/align]
[align=left]                  for (int i=0; i<childCount; i++)[/align]
[align=left]                  {[/align]
[align=left]                        //获得子节点的index[/align]
                        QModelIndex child = this->index(i,
0, index);
[align=left]                        //递归,改变子节点的checkbox状态[/align]
[align=left]                        setData(child, value, Qt::CheckStateRole);[/align]
[align=left]                  }[/align]
[align=left]            }[/align]
[align=left]      }[/align]
[align=left]
[/align]
[align=left]      return true;[/align]
[align=left]}[/align]
[align=left]
[/align]

[align=left]QVariant TreeModel::data(const QModelIndex &index, int role) const[/align]
[align=left]{[/align]
[align=left]    if (!index.isValid())[/align]
[align=left]        return QVariant();[/align]
[align=left]
[/align]
[align=left]      TreeItem *item = static_cast<TreeItem*>(index.internalPointer());[/align]
[align=left]
[/align]
[align=left]      //判断显示的对象是checkbox,并且位于第一列[/align]
[align=left]      if (role==Qt::CheckStateRole && index.column()==0)[/align]
            return static_cast<int>( item->isChecked()
? Qt::Checked : Qt::Unchecked );
[align=left]
[/align]
[align=left]    if (role != Qt::DisplayRole)[/align]
[align=left]        return QVariant();[/align]
[align=left]
[/align]
[align=left]    return item->data(index.column());[/align]
[align=left]}[/align]
[align=left]
[/align]

[align=left]Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const[/align]
[align=left]{[/align]
[align=left]    if (!index.isValid())[/align]
[align=left]        return 0;[/align]
[align=left]
[/align]
[align=left]      if (index.column()==0)   //如果是第一列的结点,则使其有显示checkbox的能力[/align]
[align=left]            return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; [/align]
[align=left]
[/align]
[align=left]    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;[/align]
[align=left]}[/align]

treeItem.h

[align=left]#ifndef TREEITEM_H[/align]
[align=left]#define TREEITEM_H[/align]
[align=left]
[/align]
[align=left]#include <QList>[/align]
[align=left]#include <QVariant>[/align]
[align=left]
[/align]
[align=left]//! [0][/align]
[align=left]class TreeItem[/align]
[align=left]{[/align]
[align=left]public:[/align]
    TreeItem(const QList<QVariant>
&data, TreeItem *parent =
0);
[align=left]    ~TreeItem();[/align]
[align=left]
[/align]
[align=left]    void appendChild(TreeItem *child);[/align]
[align=left]
[/align]
[align=left]    TreeItem *child(int row);[/align]
[align=left]    int childCount() const;[/align]
[align=left]    int columnCount() const;[/align]
[align=left]    QVariant data(int column) const;[/align]
[align=left]    int row() const;[/align]
[align=left]    TreeItem *parent();[/align]
[align=left]
[/align]
[align=left]      bool m_checked;[/align]
[align=left]      bool isChecked();[/align]
[align=left]      void setCheckState(bool state);[/align]
[align=left]
[/align]
[align=left]private:[/align]
[align=left]    QList<TreeItem*> childItems;[/align]
[align=left]    QList<QVariant> itemData;[/align]
[align=left]    TreeItem *parentItem;[/align]
[align=left]};[/align]
[align=left]//! [0][/align]
[align=left]
[/align]
[align=left]#endif[/align]
treeItem.cpp

[align=left]#include <QStringList>[/align]
[align=left]
[/align]
[align=left]#include "treeitem.h"[/align]
[align=left]
[/align]
[align=left]//! [0][/align]
TreeItem::TreeItem(const QList<QVariant>
&data, TreeItem *parent)
[align=left]{[/align]
[align=left]    parentItem = parent;[/align]
[align=left]    itemData = data;[/align]
[align=left]      // 默认全部选择[/align]
[align=left]      m_checked = true;[/align]
[align=left]}[/align]
[align=left]//! [0][/align]
[align=left]
[/align]
[align=left]//! [1][/align]
[align=left]TreeItem::~TreeItem()[/align]
[align=left]{[/align]
[align=left]    qDeleteAll(childItems);[/align]
[align=left]}[/align]
[align=left]//! [1][/align]
[align=left]
[/align]
[align=left]//! [2][/align]
[align=left]void TreeItem::appendChild(TreeItem *item)[/align]
[align=left]{[/align]
[align=left]    childItems.append(item);[/align]
[align=left]}[/align]
[align=left]//! [2][/align]
[align=left]
[/align]
[align=left]//! [3][/align]
[align=left]TreeItem *TreeItem::child(int row)[/align]
[align=left]{[/align]
[align=left]    return childItems.value(row);[/align]
[align=left]}[/align]
[align=left]//! [3][/align]
[align=left]
[/align]
[align=left]//! [4][/align]
[align=left]int TreeItem::childCount() const[/align]
[align=left]{[/align]
[align=left]    return childItems.count();[/align]
[align=left]}[/align]
[align=left]//! [4][/align]
[align=left]
[/align]
[align=left]//! [5][/align]
[align=left]int TreeItem::columnCount() const[/align]
[align=left]{[/align]
[align=left]    return itemData.count();[/align]
[align=left]}[/align]
[align=left]//! [5][/align]
[align=left]
[/align]
[align=left]//! [6][/align]
[align=left]QVariant TreeItem::data(int column) const[/align]
[align=left]{[/align]
[align=left]    return itemData.value(column);[/align]
[align=left]}[/align]
[align=left]//! [6][/align]
[align=left]
[/align]
[align=left]//! [7][/align]
[align=left]TreeItem *TreeItem::parent()[/align]
[align=left]{[/align]
[align=left]    return parentItem;[/align]
[align=left]}[/align]
[align=left]//! [7][/align]
[align=left]
[/align]
[align=left]//! [8][/align]
[align=left]int TreeItem::row() const[/align]
[align=left]{[/align]
[align=left]    if (parentItem)[/align]
[align=left]        return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));[/align]
[align=left]
[/align]
[align=left]    return 0;[/align]
[align=left]}[/align]
[align=left]//! [8][/align]
[align=left]
[/align]
[align=left]bool TreeItem::isChecked()[/align]
[align=left]{[/align]
[align=left]      return m_checked;[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]void TreeItem::setCheckState(bool state)[/align]
[align=left]{[/align]
[align=left]      m_checked = state;[/align]
[align=left]}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt c