目录

  • 动态设置复选框的步骤
  • QT MVC的概念
    • 模型
      • 添加数据
      • 获取数据
    • 视图
    • 槽函数

动态设置复选框的步骤

初始化一个QTreeView 的界面,并设置相关的model

// 在ui中新建两个QTreeView 命名为 addedView,notAddView
//初始化QTreeView 界面ui->setupUi(this);ui->addedView->header()->hide();//表头隐藏ui->notAddView->header()->hide();//设置model
QStandardItemModel m_addedModel, m_notAddModel;
ui->addedView->setModel(&m_addedModel);
ui->notAddView->setModel(&m_notAddModel);

从数据库或其他地方获取相关数据:QSet<QString> addPeople,QSet<QString> notAddPeople
其中addPeople展示在addedView界面上,notAddPeople展示在notAddView界面上

    if(!addPeople.empty()){m_addedModel.clear();//如果addPeople(群已有成员)存在,则显示在界面上if(!addPeople.empty()){int i=0;QSet<QString>::iterator iter;for(iter = addPeople.begin(); iter != addPeople.end(); iter++){QStandardItem* pTem = new QStandardItem;  // 新建项pTem->setText(*iter);                     // 设置显示的名称pTem->setCheckable(true);                 // 设置为复选框m_addedModel.appendRow(pTem);             // 把新建项插入到模型中}}}

复选框如下图所示

功能:右边(未添加成员界面)选中复选框,点击添加,被选中的人会移到左边(已有成员)

将按钮和槽函数绑定:

connect(ui->pushButtonAdd, SIGNAL(clicked()), this, SLOT(slot_pushButtonAdd_clicked()));

槽函数思路

  • QStandardItemModel
    资料:函数介绍,TableView、QStandardItemModel、QItemSelectionModel
    暂且将该函数理解为管理二位数据的类,我们通过ui->addedView->setModel(&m_addedModel);将视图view和QStandardItemModel 绑定到一起。这样就可以通过QStandardItemModel 来管理显示在视图上的数据了

选中的数据,通过QStandardItemModel 来获取:
首先遍历QStandardItemModel 所有数据,查看哪个复选框被选中了checkState() == Qt::Checked
如果选中了,就新建一个QStandardItem,加入到m_addedModel模型中
代码如下:

QStringList vecIndexs;for (int i = 0; i < m_notAddModel.rowCount(); i++) //遍历每一行{if (m_notAddModel.itemFromIndex(m_notAddModel.index(i, 0))->checkState() == Qt::Checked) //获取每一行的第一列,我只用了一列{QStandardItem* pItemEx = new QStandardItem(m_notAddModel.itemFromIndex(m_notAddModel.index(i, 0))->text());pItemEx->setCheckable(true);m_addedModel.appendRow(pItemEx);}else{vecIndexs.push_back(m_notAddModel.itemFromIndex(m_notAddModel.index(i, 0))->text());}}m_notAddModel.clear();for (size_t i = 0; i < vecIndexs.size(); i++){QStandardItem* pItemEx = new QStandardItem(vecIndexs[i]);pItemEx->setCheckable(true);m_notAddModel.appendRow(pItemEx);}

以上是解决:点击按钮,处理复选框的内容。
如果要解决点击复选框,处理复选框,比如点击父节点,全选子节点。

参考: Qt树形控件QTreeView使用2——复选框的设置

通过QStandardItemModel设置的项目,任何改变都会触发void QStandardItemModel::itemChanged(QStandardItem * item)信号
关联项目属性改变的信号和槽
connect ( model ,&QStandardItemModel::itemChanged , this ,&Widget::treeItemChanged );

void Widget : : treeItemChanged ( QStandardItem * item )
{if ( item == nullptr )return ;if ( item - > isCheckable ()){//如果条目是存在复选框的,那么就进行下面的操作Qt : : CheckState state = item - > checkState (); //获取当前的选择状态if ( item - > isTristate ()){//如果条目是三态的,说明可以对子目录进行全选和全不选的设置if ( state != Qt : : PartiallyChecked ){//当前是选中状态,需要对其子项目进行全选treeItem_checkAllChild ( item , state == Qt : : Checked ? true : false );}}else{//说明是两态的,两态会对父级的三态有影响//判断兄弟节点的情况treeItem_CheckChildChanged ( item );}}
}

这里的逻辑是:点击复选框就会触发 QStandardItemModel::itemChanged 信号,查看当前项的状态,对它进行操作。
和上一个事件对比:点击按钮,需要遍历所有项目QStandardItem,一个个查看是否选中(不知道有没有更好的方法)

问题:没有搞清楚 QItemSelectionModel干吗用的?
我弄混了的概念
QTreeView使用总结5,选中信号处理
Qt 学习之路:视图选择 (QItemSelectionModel)
Qt模型/视图框架(一)

QT MVC的概念

Qt Model/View(模型/视图)结构(无师自通)
模型-视图 编程

模型

所有的基于项数据的数据模型(Model)都是基于 QAbstractltemModel 类的,这个类定义了视图组件和代理存取数据的接口。数据无需存储在数据模型里,数据可以是其他类、文件、数据库或任何数据源。

QStringListModel 用来保存一列QString项。
QStandardItemModel 管理更复杂是树形数据结构,每一个条目都可以保存任意数据。
QFileSystemModel 提供了本地文件系统的文件和目录信息。
QSqlQueryModel, QSqlTableModel, 和 QSqlRelationalTableModel 通过模型/视图的约定规则来访问数据库。

目前用到的是 QStandardItemModel

添加数据

往表格添加数据:

QStandardItemModel tableModel(4, 4);for (int row = 0; row < 4; ++row){for (int column = 0; column < 4; ++column) {QStandardItem *item = new QStandardItem(QString("%0,%1").arg(row).arg(column));tableModel.setItem(row, column, item);}}QTableView tableView;tableView.setModel( & tableModel );

添加角色

QStandarItemModel *m_model = new QStandarItemModel ;QStandardItem *item = new QStandardItem;item->setData(QVariant(getVariantList(info)), Qt::DisplayRole);item->setData(QVariant(iconSize()), Qt::SizeHintRole);m_model->appendRow(item);

获取角色

QString name=item->data(Qt::SizeHintRole);

其中QStandardItem初始化 QStandardItem(Qstring a) 界面会显示a字符串

获取数据

参考QStandardItemModel的用法

在视图上设置模型之后,通常需要对用户操作做出反应,例如单击项目。由于QAbstractItemView提供基于QModelIndex的信号和函数,您需要一种方法来获得与给定QModelIndex对应的q标准化,反之亦然。itemFromIndex()和indexFromItem()提供了这个映射。itemFromIndex()的典型应用包括获取项目目前的索引视图,并获取项对应于一个索引由QAbstractItemView信号,如QAbstractItemView:点击()。首先在你的类中连接视图的符号

  QTreeView *treeView = new QTreeView(this);treeView->setModel(myStandardItemModel);connect(treeView, SIGNAL(clicked(QModelIndex)),this, SLOT(clicked(QModelIndex)));
   当您收到信号时,您在给定的模型索引上调用itemFromIndex(),以获得指向该项目的指针:
 void MyWidget::clicked(const QModelIndex &index){QStandardItem *item = myStandardItemModel->itemFromIndex(index);}
    相反,当您希望调用以索引为参数的模型/视图函数时,您必须获得项目的QModelIndex。您可以通过使用model的indexFromItem()函数来获得索引,也可以通过调用q标准化tem::index()来获得该索引:

treeView->scrollTo(item->index());

返过的错误

m_addedModel.itemFromIndex(m_addedModel.index(i, 0))->data().toString()

当时 m_addedModel.index(i, 0)并没有设置 data,即,

QStandardItem* pItemEx = new QStandardItem(vecIndexs[i]);pItemEx->setData(strDatas.at(i));//这一步没有

所以那一行没有获取到数据

视图

视图用于显示模型中的数据

槽函数

QTreeView使用总结5,选中信号处理

Q_SIGNALS:void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);void currentChanged(const QModelIndex &current, const QModelIndex &previous);void currentRowChanged(const QModelIndex &current, const QModelIndex &previous);void currentColumnChanged(const QModelIndex &current, const QModelIndex &previous);void modelChanged(QAbstractItemModel *model);

例子:

//a.h
void SlotModelItemClickedShowBaseInfo(const QModelIndex &current, const QModelIndex &previous);//a.cpp
connect(ui->treeView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(SlotModelItemClickedShowBaseInfo(const QModelIndex &, const QModelIndex &)));void a::SlotModelItemClickedShowBaseInfo(const QModelIndex &current, const QModelIndex &previous) {QStandardItem* item = m_model.itemFromIndex(current);if (item){QString modelName = item->text();ui->label->setText(modelName);}
}

QTreeView 动态设置复选框相关推荐

  1. PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态

    先看效果图,选中了几行,然后将选中的内容展示出来. 我设置两个有序序列,分别存储对应的复选框和行内容. 我的行内容是用的 label 标签. # 存储右边label组件的有序列表def get_L_b ...

  2. HTML如何设置复选框、单选框以及默认选项?

    本篇文章主要给大家介绍HTML怎么设置复选框以及单选框的. 我们在网站开发过程中,有时会需要实现类似调查问卷的功能,那么既然是问卷,就避免不了单选或者多选的情况.对于新手朋友来说,或许不太清楚. 下面 ...

  3. Java 根据模板导出Excel时,如何根据后台数据设置复选框的勾选

    我之前遇到这个问题,上网查找解决方案.都说要在Excel中设置复选框的链接单元格,然后通过赋值给单元格控制复选框的勾选. 在我设置好链接单元格之后,点击复选框,单元格中的值会改变 TRUE 或 FAL ...

  4. php调查问卷单选框标题,word调查问卷制作:怎样设置复选框各单选框

    在信息自动化的时代下,为了向用户了解和采集一些基本信息,经常会使用电子调查问卷收集所需数据,采用这种形式无疑比以往的纸质调查问卷更为快捷方便. 而在电子调查问卷中,让我们最为熟悉的就是针对各种问题设定 ...

  5. 设置复选框选中及其使用

    设置复选框选中及其使用 开发工具与关键技术:VS .MVC 撰写时间:2019/7/26 有一些需要就在你触发某个按钮的时候,单选框或者复选框就是一个选中的状态,并且要记录这个状态的时候:页面的复选框 ...

  6. ztree指定节点 设置复选框

    ztree指定节点 设置复选框 首先,需引入ztree的js文件 <script src="../../assets/ztree/js/jquery.ztree.core-3.5.mi ...

  7. 使用JavaScript动态添加复选框Checkbox

    首先,使用JS动态产生Checkbox可以采用如下类似的语句: var checkBox=document.createElement("input"); checkBox.set ...

  8. jquery设置复选框为只读_checkbox设置复选框的只读效果不让用户勾选

    在Web开发中,有时候需要显示一些复选框(checkbox),表明这个地方是可以进行勾选操作的,但是有时候是只想告知用户"这个地方是可以进行勾选操作的"而不想让用户在此处勾选(比如 ...

  9. QTreeWidgetItem设置复选框的禁用状态

    QTreeWidgetItem在使用复选框时,有时候会存在根据条件禁用复选框的情况,此时可以借助复选框三态模式中的半选状态来实现禁用状态的显示,同时需要去掉QTreeWidgetItem的Qt::It ...

最新文章

  1. matlab 某些函数
  2. 判断字符串是否以指定字符开头
  3. 用python定义一个员工类_Python:定义一个只有整数定义的类
  4. 【STM32】定时器相关函数和类型
  5. Tortoise SVN使用方法,简易图解
  6. output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
  7. 大学留级两年不敢和家人说_您说什么:如何与家人保持联系?
  8. Java学习之文件操作
  9. NUnit单元测试笔记
  10. With(ReadPast)就不会被阻塞吗?
  11. Python爬取B站弹幕+Gephi梳理主线剧情
  12. hadoop 操作(二)
  13. Redis GEO 特性在 LBS 中的应用总结
  14. 【LeetCode】【字符串】题号:*14. 最长公共前缀
  15. 【图像增强】基于matlab同态滤波+Retinex+模糊技术图像增强【含Matlab源码 1013期】
  16. 【iOS 开发】基础控件:UISwitch
  17. Android-更改字体(LED液晶数字字体)
  18. android单选题数据库,数据库系统工程师题库
  19. Ubuntu 老版本下载
  20. 元素偏移offset的常用属性

热门文章

  1. 难以忘怀的感动----《喜剧之王》
  2. k8s部署有状态(StatefulSet)zk-kafka集群
  3. 运筹优化学习24:Gurobi902注册、下载、安装教程【保姆级手把手教学】
  4. systemtap examples
  5. kaldi中文语音识别(1)
  6. 分享一个WininetAPI的helper类
  7. cad尺寸标注快捷键_Auto CAD 尺寸标注快捷键
  8. 瑞幸宣布全国门店数量超3000家 目标年底超4500家
  9. 后台getshell常用技巧
  10. 碳通宝打造创新绿色金融产品,多元化业务拓宽收益通道