本小节属于《QTreeView使用代理实现表项编辑、定制显示控件》:系列教程之八的子章节。

由于本章节内容较多,放在一起可能大家看起来比较费劲,所以进行了拆分,大家可以从这里《QTreeView使用系列教程目录》找到其他的小节内容。


接下来开始讲解,QTreeView中嵌入QPushButton实现命令操作。

本小节比之前要稍微麻烦一些,之前我们都是嵌入的被动显示的控件,而QPushButton需要持久化存在。在显示的同时,还需要响应鼠标操作。但是跟双击启动一个Editor编辑数据不同,在同一时刻只会有一个Editor,QPushButton需要显示多个,持久化存在。

度娘到2个方案:

(1)重写paint()计算按钮位置,绘制按钮,然后重写editorEvent()处理鼠标消息,转化为按钮抬起信号。

参考《Qt 之模型/视图(自定义按钮)》

(2)使用网友造好的一个轮子,大概原理也是通过重写paint()来实现的,但是我们派生出来使用时,与继承QStyledItemDelegate区别不大。

参考《Model/View模块中Delegate的扩展:持久Delegate(一)》

这2个方案都能实现,具体怎么选择就看情况了。

下面以(2)方案为例进行说明:

PersistentStyledItemDelegate类为造好的轮子基类。我们派生出ButtonDelegate类。在createEditor()中,按照创建Editor并返回的思路,创建一个QWidget和QPushButton,然后把QPushButton布局在QWidget中,并返回QWidget,其间添加QPushButton信号通知出来,以便外部处理。

class ButtonDelegate : public PersistentStyledItemDelegate
{Q_OBJECT
public:ButtonDelegate(QObject *parent = nullptr): PersistentStyledItemDelegate(parent) { }void setText(const QString &text) { _text = text; }void setIcon(const QIcon &icon) { _icon = icon; }signals:void clicked(const QModelIndex& index);public://因为按钮既不需要从model读取数据,也不需要写入,因此仅需要重写一个函数即可QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{QPersistentModelIndex perIndex(index);QWidget *widget = new QWidget(parent);widget->setAutoFillBackground(true);QHBoxLayout *layout = new QHBoxLayout();layout->addStretch();layout->setContentsMargins(2, 2, 2, 2);QPushButton *btn = new QPushButton();btn->setMinimumHeight(24);btn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);if (!_text.isEmpty())   btn->setText(_text);if (!_icon.isNull())   btn->setIcon(_icon);btn->setStyleSheet(BTN_QSS);layout->addWidget(btn);layout->addStretch();widget->setLayout(layout);QObject::connect(btn,&QPushButton::clicked,[=]{QModelIndex tIndex = static_cast<QModelIndex>(perIndex);//const成员里,不能修改对象,因此不能emit信号auto temp = const_cast<ButtonDelegate *>(this);emit temp->clicked(tIndex);});return widget;}private:QString _text;QIcon _icon;const QString BTN_QSS = "QPushButton{""border-image: url(:/res/download_normal.png);""}""QPushButton::hover{""border-image: url(:/res/download_normal.png);""}""QPushButton::pressed{""border-image: url(:/res/download_press.png);""}";
};

给第7列指定委托,那么第7列使用QPushButton响应操作。

ButtonDelegate* button = new ButtonDelegate(ui->treeView);
connect(button, &ButtonDelegate::clicked, this, &MainWindow::onButtonClicked);
ui->treeView->setItemDelegateForColumn(7, button);
void MainWindow::onButtonClicked(const QModelIndex &index)
{if(!index.isValid())return;QMessageBox::information(this, "提示", QString("点击(%1,%2)").arg(index.row()).arg(index.column()));
}

效果:


若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

本文涉及工程代码,公众号回复:34EditorDelegate,即可下载。

《QTreeView中嵌入QPushButton实现命令操作》:系列教程之八(第8小节)相关推荐

  1. Linux里命令卸载mysql,linux中mysql完整卸载命令操作

    yum方式安装的mysql 1.yum remove mysql mysql-server mysql-libs compat-mysql51 2.rm -rf /var/lib/mysql 3.rm ...

  2. Zerto中VPG恢复CURL命令操作实践

    1.获取SessionID 1.1从Zerto中获取SessionID 通过CURL命令方式取Zerto环境中的SessionID: curl -s -k -D responseHeader.txt ...

  3. c# 数组中的空值_C# 数据操作系列 - 1. SQL基础操作

    0.前言 前篇介绍了一些数据库的基本概念和以及一些常见的数据库,让我们对数据库有了一个初步的认识.这一篇我们将继续为C#数据操作的基础填上一个空白-SQL语句. SQL(Structured Quer ...

  4. Redis-Linux中安装Redis、命令操作Redis

    目录 一.Redis简介 NoSQL与SQL的区别 二.Linux上安装redis 上传并解压redis.gz 进入 redis的解压目录,执行命令 make ​编辑 修改redis为守护进程 们测试 ...

  5. cad2016中选择全图字体怎么操作_cad教程分享CAD如何替换找不到的原文字体?

    Autocad教程公众号,专注于cad教程.cad教程视频的分享,欢迎关注,下载你所需的教程资源! 如你还未关注,请点击文章标题下方蓝色字体的"Autocad教程"进行关注. ca ...

  6. cad2016中选择全图字体怎么操作_cad教程分享CAD中如何删除顽固图层?

    Autocad教程公众号,专注于cad教程.cad教程视频的分享,欢迎关注,下载你所需的教程资源! 如你还未关注,请点击文章标题下方蓝色字体的"Autocad教程"进行关注. ca ...

  7. ci php做记录删除,CI(CodeIgniter)框架中的增删改查操作_PHP教程

    CodeIgniter的数据函数类在 \system\database\DB_active_rec.php 代码如下: class ModelName extends CI_Model { funct ...

  8. java中怎样导入图片6_Spire.Doc系列教程(6):插入图片到 Word 以及提取 Word 中的图片...

    图片是Word文档的基本要素之一,常见的对Word图片的操作有插入.删除.替换和提取.本文将介绍如何使通过编程的方式添加图片到指定位置,以及如何获取Word文档中的图片并保存到本地路径. 在指定位置插 ...

  9. Linux中的报错命令,Linux学习教程-Linux下命令的一些异常情况

    导读 命令不全:在命令没有输入完 (引号或括号没有配对),就不小心按下了Enter键,终端会提示出一个>代表命令不完整,这是可以继续输入,也可以ctrl+c终止输入,重新再来.(下面sed命令使 ...

  10. Linux (x86) Exploit 开发系列教程之八 绕过 ASLR -- 第三部分

    绕过 ASLR – 第三部分 译者:飞龙 原文:Bypassing ASLR – Part III 预备条件: 经典的基于栈的溢出 绕过 ASLR – 第一部分 VM 配置:Ubuntu 12.04 ...

最新文章

  1. Git Merge VS Rebase
  2. 区块链实践(一) 以太坊网络+geth搭建私有网络实战
  3. mac os 录屏快捷键_Mac跨平台自动同步记事本
  4. 解决Cannot load /usr/local/apache/modules/libphp5.so的方法
  5. 内部类的小总结(语法和用法方面)
  6. 锐龙版和linux有什么区别,华为MateBook D 14锐龙版Linux版价格为何这么便宜
  7. jsoup: Java HTML Parser
  8. 通过用户电脑ip获取用户当前所在城市以及天气
  9. 《基于Nginx的中间件架构》学习笔记---3.nginx的目录分析
  10. 模2运算的原理 模2加法,模2减法,模2乘法,模2除法
  11. 基于Ubuntu虚拟机的Linux驱动开发入门
  12. win7系统服务器修改文件权限,Windows7系统修改Trustedinstaller权限文件的方法
  13. 项目范围管理(重点)-真题答案与解析
  14. 如何找到自己正确需要的抖音搜索关键词
  15. C++数字三角形问题(动态规划)
  16. fastapi——快速入门
  17. 地铁大数据挖掘之数据预处理——从原始一卡通数据提取城市地铁客流(二)
  18. 列表、下标、切片及练习
  19. 数字图像处理之图像增强
  20. No Miracle

热门文章

  1. IEC60958/61937协议
  2. fterm linux ssh 乱码,用fterm ssh时出现如下乱码,请问如何解决
  3. qt中c语言运行中文字体乱码,QString 与中文问题/Qt界面中文字体及大小设置
  4. 服务器lsass状态代码c0000005,提示lsass.exe失败状态代码c0000005
  5. 下载安装MinGW-w64详细步骤(c/c++的编译器gcc的windows版,win10真实可用)
  6. 服务器系统驱动精灵,驱动精灵2009 新版启动快运行稳
  7. win10外放与耳机不能够自动切换没有声音的问题 声卡问题
  8. 架构师的“功夫在诗外”之二
  9. 对overflow与zoom”清除浮动”的一些认识
  10. 软件技巧:优蛋开启出现Failed to set data for错误