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
treeItem.h
treeItem.cpp
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] |
[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] |
[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:在TreeModel+QTreeView中使用复选框(checkbox)
- Qt:在TreeModel+QTreeView中使用复选框(checkbox)
- Qt:在TreeModel+QTreeView中使用复选框(checkbox)
- Qt:在TreeModel+QTreeView中使用复选框问题
- Qt中使用QDirModel / QFileSystemModel + QTreeView显示Checkbox复选框
- Qt:TreeModel+QTreeView中使用图标
- Qt:TreeModel+QTreeView中使用图标
- Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置
- Qt树形控件QTreeView使用1——节点的添加删除操作 复选框的设置
- Qt树形控件QTreeView使用2——复选框的设置
- Qt树形控件QTreeView使用2——复选框的设置
- Undo/Redo for Qt Tree Model
- Qt QSortFilterProxyModel示例代码, 使用方法
- 使用 Jackson 树模型(tree model) API 处理 JSON
- 006CheckBox复选框的使用
- 如何编写一个使用Store更新复选框的CheckboxGroup的插件
- QT 生成带checkbox的QTreeView
- ASP.NET中 CheckBox复选框控件的使用
- Qt属性表控件的使用 QtTreePropertyBrowser
- Qt Model/View 学习笔记 (二):为使用Models与views热身