Qt技术重绘QtableView方法

2023-11-18

在项目过程中需要在列表中用图形显示磁盘的使用情况。这用Qt自身的QTableview控件不能完全实现。需要用委托进行重绘。

创建一个委托类继承QItemDelegate类

然后实现void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;方法。

代码如下

//委托根据model数据重绘显示在Qtableview中
void MyDiskDelegate::paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{  
painter->setFont(CDataPublic::getCustomFont(false, 8));
QPen SZpen(QColor(100,106,123));
painter->setPen(SZpen);

QStyleOptionViewItemV4 opt = setOptions(index, option);
QRect drawRectIcon;
QRect drawRectText;
int   textLength;
if (index.column() == 0)  //第一列
{
  painter->save();
  drawBackground(painter, opt, index);  
  QString driverText = (index.data(Qt::DisplayRole)).toString();
  textLength = driverText.length();
  QString drawText = driverText.left(textLength-1);
  int diskType = driverText.right(1).toInt();
 
  QPixmap driverIcon;
  if (diskType == DeviceType_Disk)
  {
   driverIcon = QPixmap(CDataPublic::getPicResFullPath("DiskIcon.png"));
  }
  else if(diskType == deviceType_mobile)
  {
   driverIcon = QPixmap(CDataPublic::getPicResFullPath("RemoveDiskIcon.png"));
  }
 
  drawRectIcon = QRect(opt.rect.topLeft()+QPoint(10,5), QSize(20,20));
  drawRectText = QRect(drawRectIcon.topRight()+QPoint(3,2), QSize(textLength*16,20));
  if (driverText == tr(""))
  {
             driverText = tr("LocalDisk");
  }

  painter->drawPixmap(drawRectIcon, driverIcon);
  painter->drawText(drawRectText, drawText);
 
  //drawFocus(painter, opt, drawRectText); 
  painter->restore();
}
else if (index.column() == 1) //第二列
{
  painter->save();

  int x = opt.rect.topLeft().x();
  int y = opt.rect.topLeft().y();
  int h = opt.rect.height();
  int w = opt.rect.width();

  if (index.row()%2 == 0)     //画背景
  {  
   painter->setPen(Qt::NoPen);
   painter->fillRect(QRect(x,y,w,h),QColor(255,255,255));
  }

  QPen SZpen(QColor(75, 82, 100));
  painter->setPen(SZpen);
  const QString driverText = (index.data(Qt::DisplayRole)).toString();
  drawRectText = QRect(opt.rect.topLeft()+QPoint(5,5), QSize(150,20));
  drawBackground(painter, opt, index); 
  painter->drawText(drawRectText, driverText);    //画文字  
  //drawFocus(painter, opt, drawRectText); 
  QPen pen;
  pen.setColor(CDataPublic::getBackLineColor());    //画线
  pen.setWidth(1.5);
  painter->setPen(pen);
  painter->drawLine(opt.rect.topLeft(),opt.rect.topLeft()+QPoint(0,opt.rect.height()));
  painter->restore();
}
else if (index.column() == 2)  //第三列
{
  painter->save();   

  int x = opt.rect.topLeft().x();
  int y = opt.rect.topLeft().y();
  int h = opt.rect.height();
  int w = opt.rect.width();

  if (index.row()%2 == 0)     //画背景
  {  
   painter->setPen(Qt::NoPen);
   painter->fillRect(QRect(x,y,w,h),QColor(255,255,255));
  }

  QPen SZpen(QColor(75, 82, 100));
  painter->setPen(SZpen);
  const QString driverText = (index.data(Qt::DisplayRole)).toString();
  drawRectText = QRect(opt.rect.topLeft()+QPoint(5,5), QSize(150,20));
  drawBackground(painter, opt, index);    
  painter->drawText(drawRectText, driverText); 

  QPen pen;
  pen.setColor(CDataPublic::getBackLineColor());    //画线
  pen.setWidth(1.5);
  painter->setPen(pen);
  painter->drawLine(opt.rect.topLeft(),opt.rect.topLeft()+QPoint(0,opt.rect.height()));
  painter->restore();
}
}

 

 如图所示

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt技术重绘QtableView方法 的相关文章

  • 如何使用 PyQt5 在 QWidget 上设置 numpy 数组图像

    我正在将相机中的图像作为 numpy 数组读取 我的目标是将其放入 pyqt5 的 Qwidget 中并在我的 mainwindow gui 程序上打印 但我收到以下错误 TypeError QPixmap argument 1 has u
  • jquery 移动列表视图样式

    我正在尝试设置列表视图控件的样式 但遇到问题 当我将图像宽度设置为 40px 如标记中所示 时 我似乎无法让内容正确地向左对齐 IE 我不想要图像和文本之间的间隙 这是我的标记 ul class ui listview li class u
  • 如何在“单击”槽中使用 QApplication::mouseButtons() 来判断鼠标按钮?

    我有一个 QMainWindow 并且想要处理来自其中较小的小部件 例如 tableview 的 单击 信号 最初我将信号连接到这个 QMainWindow 的插槽 这是最常见的方法 现在我需要判断单击了哪个鼠标按钮 并对左右按钮执行不同的
  • 如何为列表中的每个元素创建一个按钮并将其放在滚动区域中?

    我有一个列表 每次用户打开文件时都会获取一个元素 我需要创建一个带有文件名 列表中的元素 的按钮 每次将该文件附加到列表中时 并将该按钮放入滚动区域 问题是我总是只有一个按钮 只是更改了名称 filenames def addfiles f
  • 具有最简单学习曲线的 C++ GUI 构建选项是什么 - VS/Qt/wxWidgets/等等?

    我希望能够尽可能快速 轻松地构建 GUI 应用程序 我有能力 虽然不是专家 也没有接受过正式的培训 C 但从未使用过 GUI 构建工具包或框架或任何东西 我不是专业程序员 在构建 GUI 应用程序方面完全没有经验且无知 花了几个小时研究试图
  • QNetworkManager 默认情况下是否接受压缩回复?

    我在用Q网络管理器 https doc qt io qt qnetworkaccessmanager html从服务器获取文件 但是我不知道文件在传输过程中是否使用标准 gzip 压缩进行压缩 如果不是 如何让它们下载压缩文件 我该如何去检
  • 如果值包含逗号字符,如何使用 QSetting 读取值[重复]

    这个问题在这里已经有答案了 在我的 QT 项目中 我使用 QSettings 从 ini 文件读取值 如果该值包含逗号字符 QSettings 无法读取它 我应该如何读取这些值 逗号字符被视为列表分隔符QSettings 带逗号的 INI
  • 如何在 QML 中使用 Font Awesome

    有谁知道如何在 QML 中使用 Font Awesome 吗 我找不到任何文档或任何信息如何在 QML 中使用 Font Awesome 我喜欢做的是使用fontello http fontello com 创建最小的图标集 而不是从 Fo
  • 更改 QT 主窗口的标题字体

    我想知道如何更改 QT 主窗口的标题字体 请参阅随附的屏幕截图 我尝试更改样式表等 但它不起作用 我也尝试使用 C 发送消息 但这也有效 SendMessage form gt effectiveWinId WM SETFONT WPARA
  • pyqt在mac osx雪豹中安装问题

    我正在学习制作桌面应用程序的教程 使用python和qt4 我下载并安装了qt Creator ide 创建了 ui文件 然后我必须使用pyuic4对其进行转换 我已经尝试了很多东西但仍然无法做到 我以为pyuic4会用Qt Creator
  • 将 WebGL 应用程序部署为本机 iOS 或 Android 应用程序?

    有谁知道如何将 WebGL 应用程序部署为本机 iOS 或 Android 应用程序 商业中间件是可以接受的 但开放项目会更好 谢谢 作为 Joris 答案的延伸 这似乎是基于内森 德弗里斯的作品 http atnan com blog 2
  • 如何从 USB 加载 LUKS 密码,然后返回键盘?

    我想设置一台具有全磁盘加密功能的无头 Linux Debian Wheezy PC 能够使用 USB 驱动器或通过键盘输入密码来解锁磁盘 我的起点是使用 Debian 安装程序中基本的整个磁盘加密选项进行全新安装 该安装程序将 boot 之
  • 为树视图创建 Qt 模型

    我正在用 Qt 使用 C 编写一个应用程序 我需要在树视图中表示一个对象结构 实现此目的的方法之一是为此创建一个模型 但在阅读有关该主题的 Qt 文档后我仍然很困惑 我的 结构 非常简单 有一个Project持有的物体Task中的对象std
  • 单击旁边的按钮时如何引用动态创建的标签 [Qt]

    每次按下 添加客户端 按钮时 减号按钮 客户端名称 客户端计数器和加号按钮都会以水平线添加到网格布局中 我想在按下加号 减号按钮时更新计数 QLabel 这是我的代码 include widget h include ui widget h
  • Qt for Android:无法签署应用程序的发布版本

    我正在使用 Qt 5 13 和 Qt Creator 4 9 2 我可以成功构建 Android 应用程序的调试版本 但是当我尝试编译发布版本时 我得到 16 57 35 过程 opt Qt 5 13 0 android armv7 bin
  • 无法在Mac上安装qwt设计器插件

    我无法在 Mac 上安装 qwt 设计器插件 我已经下载了 v 6 1 3 并成功完成了 qmake make 和 sudo make install 问题是 在 usr local qwt 6 1 3 lib 下 我只有文件 qwt fr
  • 为什么我的 QGestureRecognizer 收不到触摸事件?

    上下文 我正在尝试创建一个类似推子的小部件 它可以在同一视图中具有多个实例 每个实例都可以由不同的手指同时控制 我想用Qt的手势识别系统 http qt project org doc qt 4 8 gestures overview ht
  • QT布局,如何使水平布局中的小部件向下移动一行而不是溢出窗口

    现在我有一个 QHBoxLayout W W W W W W 我将尺寸调整得更小 得到 W W W W lt gt 我想要 下划线是黑色空间 W W W W W W 我不确定哪种布局可以做到这一点 有人有主意吗 KDE 设置应用程序可以满足
  • 如何在QLineEdit/QLabel等中从左到右显示阿拉伯符号?

    在Qt的实现中阿拉伯符号显示在右到左方向 因此任何包含阿拉伯符号的字符串都将右对齐 但我的应用程序想要做的是显示所有文本左到右方向 无论是否包含阿拉伯符号 所有文本都是左对齐的 一个例子如下所示 This is 我想实现什么 就是这样QLi
  • 纹理openGl。 C++、qt

    我试图用草纹理覆盖我的地形 由高度图制成 但它没有按预期工作 我什至无法在简单的 GL QUAD 上获取纹理 结果是多色网络 void GLWidget initializeGL glEnable GL TEXTURE 2D 在 QGLwi

随机推荐

  • [高光谱] 开源项目Hyperspectral-Classification Pytorch解析之main

    开源项目Hyperspectral Classification Pytorch解析之main py 编码方式 coding utf 8 项目简介 DEEP LEARNING FOR HYPERSPECTRAL DATA This scri
  • 解决在cmd情况下无法连接MySQL情况(无脑操作教程)

    在输入外部命令 mysql u root p的时候 出现下面的情况 网图 侵删 问题分析 可能是MySQL路径问题没有解决 解决方法 1 打开电脑高级设置 2 点击环境变量 3 找到path路径变量后 点击编辑 4 新建路径 此路径是我保存
  • Java实现图片裁剪预览功能

    在项目中 我们需要做些类似头像上传 图片裁剪的功能 ok看下面文章 需要插件 jQuery Jcrop 后端代码 package org csg upload import java awt Rectangle import java aw
  • std::promise介绍及使用

    一 std promise介绍 std promise是C 11并发编程中常用的一个类 常配合std future使用 其作用是在一个线程t1中保存一个类型typename T的值 可供相绑定的std future对象在另一线程t2中获取
  • 使用OpenCV获取图像中某一点的像素值和修改某一点的像素值

    使用OpenCV获取图像中某一点的像素值和修改某一点的像素值 int my getpixel IplImage img cvLoadImage D Case Train1 bmp 1 CvScalar s for int i 0 i
  • 回文链表和链表reverse()

    链接 判断一个链表是否是回文字符串 快慢指针 链表reverse 考虑是偶数链表还是 reverse 以后都构造不包含头节点都结果链表 其实跟我以前都思路是一样的想法 同样是采用头插入法和分开两个链表的做法情况 public void re
  • 通义千问,阿里版ChatGPT,拿到邀请码了

    大家好 我是章北海mlpy 通义千问是阿里巴巴推出的一个大型预训练模型 是达摩院自主研发的超大规模语言模型 能够回答问题 创作文字 还能表达观点 撰写代码 昨天中午 阿里云通过官方微信公众号对旗下的超大规模语言模型通义千问进行官宣 并面向企
  • 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 无法将“obj\Debug\上位机.exe”复制到“bin\Debug\上位机.exe”。超出了重试计数 10。失败

    项目场景 提示 Visual studio常见bug 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 无法将 obj Debug 上位机 exe 复制到 bin Debug 上位机 exe 超出了重试计数 10 失败 解决方案 提示
  • Unity Shader 基础(2) Image Effect

    Unity Shader 基础 2 Image Effect Unity中 Image Effect 是Post Processing的一种方 Unity自身也提供很多Effect效果供使用 Image Effect的使用官方文档做了很多介
  • Vue使用Element-ui表单发送数据和多张图片到后端

    在做项目的时候遇到一个问题 前端需要上传表单到后端 表单数据包括文本内容和图片 后端我用的是Nodejs 效果类似下图 前端需要向后端传商品名称 价格 描述 商品图片 前端准备 利用Element ui中的表单功能和上传功能 将upload
  • 【面试八股文】每日一题:谈谈你对IO的理解

    谈谈你对IO的理解 每日一题 Java核心 谈谈你对对IO的理解 面试八股文 1 Java基础知识 Java IO Input Output 是Java编程语言中用于处理输入和输出的一组类和接口 它提供了一种在Java程序中读取和写入数据的
  • Web前端部署的几种方法和步骤

    随着互联网技术的发展和普及 Web前端开发已成为当今最重要和最具前景的技能之一 与此同时 如何将 Web 前端部署到服务器上已成为一个必不可少的技能 本文将介绍 Web 前端部署的几种方法和步骤 一 前置准备 在开始 Web 前端部署之前
  • linux安装SecureCRT安装教学

    linux安装SecureCRT安装教学 列如 Anolis OS8 6 安装SecureCRT8 0 目录 系列文章目录 linux安装SecureCRT安装教学教学 前言 一 securecrt安装 二 使用步骤 1 创建securec
  • verdi中如何查看force信号信息

    转载 verdi中如何查看force信号信息 骏的世界 lujun org cn 在仿真中 我们会有对信号进行force的操作 从而实现某些特定的功能 但是在仿真波形中 不能直接从波形上看出 这些信号的驱动 是因为前级电路的驱动 还是因为f
  • 为何软文营销能够做到良好的品牌推广效果

    如今的互联网已经不再是十多年前那样只能看看文字 图片 而是一个包罗万象的大集合 其中内容之丰富 已经开始有代替报纸 电视 广播等传统的信息传播途径 因此 越来越多的人选择了互联网 在互联网上的推广效果是越来越给力 面对这么大的宣传平台 很多
  • 三分钟,教你3种前端埋点方式!

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 只有了解用户 我们才能服务好用户 而最接近用户的我们 自然要承担起更多的责任 那么在一个企业中 我们要如何去了解用户呢 最直接有效的方式
  • 警告: Unable to find required classes (javax.activation.DataHandler and javax.mail

    在调试Axis1 4访问WebService服务时 出现以下警告 警告 Unable to find required classes javax activation DataHandler and javax mail internet
  • sip线路对接_线路调度一二三

    使用呼叫中心系统 在进行外呼业务时 坐席的呼出呼叫 最终需要通过各种线路进行呼出 根据线路类别不同 目前常见的有数字中继线 SIP中继对接线路 IMS接入线路 FXO大号模拟线 卡线 API对接线路 除自有线路外 根据供应商类型 主要有各地
  • 【Linux中shell脚本】Linux中shell脚本回车换行问题

    背景 windows下编辑shell脚本 报错 syntax error near unexpected token r 问题产生原因 因为windos与linux换行符不同导致 notepad 中 视图 gt 显示符号 gt 显示所有符号
  • Qt技术重绘QtableView方法

    在项目过程中需要在列表中用图形显示磁盘的使用情况 这用Qt自身的QTableview控件不能完全实现 需要用委托进行重绘 创建一个委托类继承QItemDelegate类 然后实现void paint QPainter painter con