Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2400|回复: 3
打印 上一主题 下一主题

QTreeView使用总结

[复制链接]

1229

主题

2000

帖子

7607

积分

认证用户组

Rank: 5Rank: 5

积分
7607
跳转到指定楼层
楼主
发表于 2020-3-8 17:12:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2020-3-9 17:51 编辑

http://www.qtcn.org/bbs/simple/?t66006.html
原创系列文章《QTreeView使用总结》创业一年了,主要用C++/Qt.
最近不忙,在整理一个QTreeView系列文章,总结用到的知识点。
写了一半了,这是序:
QTreeView使用总结--序
https://blog.csdn.net/dpsying/article/details/79687254

欢迎拍砖和提意见!
有什么想补充的点也欢迎提下,根据我能力补充。


序文如下:

https://blog.csdn.net/dpsying/article/details/79687254

1,简介




在Qt开发过程中,我发现树控件即QTreeView使用的非常频繁。
各种批量展示和编辑信息的地方,都用得上该控件。
我的项目在使用QTreeView过程中,用到了各种常规、不常规的功能,并进行过各种改造。

这里将这些知识与技巧作一个总结,分享给大家。




2,《QTreeView使用总结》目录




该系列文章暂拟了下列内容:
1,QTreeView一个简单使用示例
2,常用API介绍
3,表头、行列相关的设置方法
4,Model/View框架介绍
5,选中信号处理
6,单击双击的信号与事件
7,右键菜单
8,风格美化,使用qss样式表
9,使用委托示例:定制item输入效果
10,使用委托示例:定制item显示效果
11,数据过滤,使用代理model,简单过滤
12,数据过滤,使用代理model,自定义过滤条件
13,自定义model示例,大大优化性能和内存
14,自定义model示例,控制对齐和颜色
15,定时刷新后,当前选中行的处理


回复

使用道具 举报

1229

主题

2000

帖子

7607

积分

认证用户组

Rank: 5Rank: 5

积分
7607
沙发
 楼主| 发表于 2020-4-1 09:38:12 | 只看该作者
回复 支持 反对

使用道具 举报

1229

主题

2000

帖子

7607

积分

认证用户组

Rank: 5Rank: 5

积分
7607
板凳
 楼主| 发表于 2020-4-1 14:17:50 | 只看该作者
本帖最后由 Qter 于 2020-4-1 14:24 编辑

https://www.qtcentre.org/threads/63069-Changing-QStyleOptionButton-(QCheckbox)-to-use-StyleSheet-not-working

画树内部子定义风格的复选框
下面的方法不行
  1. //QStyleOptionButton check_box_style_option;
  2.                         //check_box_style_option.state |= QStyle::State_Enabled;
  3.                         //if (checked)
  4.                         //{
  5.                         //        check_box_style_option.state |= QStyle::State_On;
  6.                         //}
  7.                         //else
  8.                         //{
  9.                         //        check_box_style_option.state |= QStyle::State_Off;
  10.                         //}
  11.                         //check_box_style_option.rect = ceckBoxRect;
  12.                         //QApplication::style()->drawControl(QStyle::CE_CheckBox, &check_box_style_option, painter);
  13.                         /*QCheckBox* styledCheckBox = new QCheckBox();
  14.                         styledCheckBox->setGeometry(ceckBoxRect);
  15.                         styledCheckBox->setCheckState(checkState);
  16.                         styledCheckBox->setStyleSheet(
  17.                                 "QCheckedBox::indicator:unchecked { image: url(:/gui/images/checkbox_unchecked.png);}"
  18.                                 "QCheckedBox::indicator:checked { image: url(:/gui/images/checkbox_checked.png);}"
  19.                         );
复制代码
要用这种
  1. QPixmap indicatorPixmap;
  2.                         QStyleOptionButton check_box_style_option;
  3.                         if (checked)
  4.                         {
  5.                                 check_box_style_option.state |= QStyle::State_On;
  6.                                 indicatorPixmap = QPixmap(":/gui/images/checkbox_checked.png");
  7.                         }
  8.                         else
  9.                         {
  10.                                 check_box_style_option.state |= QStyle::State_Off;
  11.                                 indicatorPixmap = QPixmap(":/gui/images/checkbox_unchecked.png");
  12.                         }
  13.                         QApplication::style()->drawItemPixmap(painter, ceckBoxRect, 0, indicatorPixmap);
复制代码
回复 支持 反对

使用道具 举报

1229

主题

2000

帖子

7607

积分

认证用户组

Rank: 5Rank: 5

积分
7607
地板
 楼主| 发表于 2020-4-7 14:07:24 | 只看该作者
用递归实现了
下面是 collapse 所有子节点的代码
expand 所有子节点的代码类似,或者在递归函数上加一个 bool 参数就能实现。

/*collapse all child nodes*/
int childCount = model->rowCount(index);
recursive_collapse(index,childCount);

void WellImportDialog::recursive_collapse(const QModelIndex index,int childCount)
{

    for(int childNo=0;childNo<childCount;childNo++)
    {
        QModelIndex childIndex = index.child(childNo,0);
        if(ui->treeView_dir->isExpanded(childIndex))
        {
            ui->treeView_dir->setExpanded(childIndex,false);
            if(int rowCount = model->rowCount(childIndex)>0)
                recursive_collapse(childIndex,rowCount);
        }
    }

}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-29 21:23 , Processed in 0.057312 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表