QT中级(2)QTableView自定义委托(二)实现QProgressBar委托

news/2025/2/12 4:55:52/

1 写在前面的话

我们在之前写的《QT(7)-初识委托》文章末尾提到,“使用一个类继承QStyledItemDelegate实现常用的控件委托,在使用时可以直接调用接口,灵活实现各种委托”。我们接下来几篇文章将先详细讲解各个控件的委托,最后整理成一个类,并分享源码。如果大家感兴趣,可以点个关注,后面我们一起学习!

讲解比较详细,大家可以跟着一步一步做,自己就可以实现了。

2 需要用到的部分知识

《QT(3)-QTableView》
《QT(4)-QAbstractItemView》
《QT(6)-QStandardItemModel》
《QT(7)-初识委托》

3 同系列文章

QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托

4 实现QProgressBar委托

进度条一般都是要一直显示在QTableView上,所以要实现QProgressBar委托,就要重新实现paint函数。

4.1 第一步

文件结构如下:
在这里插入图片描述

在设计师界面拖拽一个tableview到MainWindow中,并对其进行初始化。
需要主要的是 void initTable(...);这个函数是我在经常使用QTableView时通用的设置,不仅可以在这个项目使用,也可以在其他项目中使用
在这里插入图片描述
代码如下:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>class QStandardItemModel;
class QTableView;QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void init();//设置表格void initTable(QTableView *tableView,int rowHeight = 25,bool Editable=false,bool isSorting = false,bool verticalHeadVisible=false,bool isLastTensile = true,bool isShowGrid = true);private:Ui::MainWindow *ui;QStandardItemModel *model;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QStandardItemModel>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->initTable(ui->tableView,27,true);this->init();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::init()
{QStringList columnNames;columnNames<<"QSpinBox"<<"QComboBox"<<"QCheckBox"<<"QProgressBar"<<"···";model = new QStandardItemModel;model->setRowCount(10);model->setHorizontalHeaderLabels(columnNames);ui->tableView->setModel(model);}void MainWindow::initTable(QTableView *tableView,int rowHeight,bool Editable,bool isSorting,bool verticalHeadVisible,bool isLastTensile,bool isShowGrid)
{/*设置样式*/tableView->setProperty("model",true);/*设置默认行高*/tableView->verticalHeader()->setDefaultSectionSize(rowHeight);/*设置交替行颜色--允许交替行颜色*/tableView->setAlternatingRowColors(true);/*设置水平/垂直滚动模式--一次滚动一个项目*/tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);/*设置选择行为--每次选择只有一整行*/tableView->setSelectionBehavior(QAbstractItemView::SelectRows);/*设置拖放行为--不允许拖放*/tableView->setDragDropMode(QAbstractItemView::NoDragDrop);/*设置选择模式--只能选择一个项目*/tableView->setSelectionMode(QAbstractItemView::SingleSelection);/*设置Tab导航键--允许使用Tab键导航,shift+tab反向导航*/tableView->setTabKeyNavigation(true);/*设置是否自动换行--取消自动换行*/tableView->setWordWrap(false);/*设置文本省略模式--省略号不会出现在文本中*/tableView->setTextElideMode(Qt::ElideNone);/*设置左上角全选按钮--禁用*/tableView->setCornerButtonEnabled(false);/*设置是否支持表头排序--应该和表头是否可以单击保持一致*/tableView->setSortingEnabled(isSorting);/*设置是否显示网格线*/tableView->setShowGrid(isShowGrid);/*设置垂直表头是否可见*/tableView->verticalHeader()->setVisible(verticalHeadVisible);/*设置选中一行表头是否加粗--不加粗*/tableView->horizontalHeader()->setHighlightSections(false);/*设置最后一行是否拉伸填充*/tableView->horizontalHeader()->setStretchLastSection(isLastTensile);/*设置行标题最小宽度尺寸*/tableView->horizontalHeader()->setMinimumSectionSize(0);/*设置行标题最小高度*/tableView->horizontalHeader()->setFixedHeight(rowHeight);/*设置表头是否可以单击--不可单击*/
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))tableView->horizontalHeader()->setSectionsClickable(isSorting);
#elsetableView->horizontalHeader()->setClickable(false);
#endif/*是否可编辑*/if(Editable){tableView->setEditTriggers(QAbstractItemView::CurrentChanged|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed);}else{tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);}
}

4.2 第二步

  1. 我们首先创建一个类Delegate继承QStyledItemDelegate,同时定义paint函数
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

这四个函数的作用以及意义,详见:《QT(7)-初识委托》这里不在赘述。

  1. 创建一些 QSpinBox相关参数,并创建相应参数的外部设置接口
    /*QProgressBar设置相关参数函数*/void setPgBarRange(const int min,const int max);void setPgBarTextVisible(bool isTextVisible);void setPgBarAlignment(Qt::Alignment pgbarAlignment);void setInvertedAppearance(bool invertedAppearance);/*QProgressBar相关参数*/int pgbarMax;int pgbarMin;Qt::Alignment pgbarAlignment;bool isTextVisible;bool invertedAppearance;QProgressBar *pgBar;

这里我定义了很多参数,实际应用的时候有些参数并用不到,大家根据需求定义。

  1. 创建给这些参数初始化的函init()
void Delegate::init()
{pgBar = new QProgressBar;pgbarMax = 100;pgbarMin = 0;pgbarAlignment = Qt::AlignCenter;isTextVisible = true;invertedAppearance = false;
}

4.3 第三步

下面我们逐个实现paint函数

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if(index.column() == 3){//获得视图中的值int value = index.model()->data(index,Qt::DisplayRole).toInt();//创建包含QProgressBar样式信息类QStyleOptionProgressBar soPgbar;//使用我们创建的pgBar初始化soPgbarsoPgbar.initFrom(pgBar);//设置最大值和最小值soPgbar.maximum = pgbarMax;soPgbar.minimum = pgbarMin;//设置进度条值soPgbar.progress = value;//设置状态soPgbar.state |= QStyle::State_Enabled;soPgbar.state |= QStyle::State_Horizontal;//设置位置和大小soPgbar.rect = option.rect;//设置文本soPgbar.text = QString("%1%").arg(value);//设置文本是否可见soPgbar.textVisible = isTextVisible;//设置文本居中soPgbar.textAlignment = pgbarAlignment;//设置进度条的进度方向soPgbar.invertedAppearance = invertedAppearance;//绘制QApplication::style()->drawControl(QStyle::CE_ProgressBar,&soPgbar,painter,pgBar);}//ifelse{QStyledItemDelegate::paint(painter,option,index);}
}

4.4 最后一步

我们需要在mainwindow.cpp中的init()调用delegate类实现委托。我们将QTableView的第一列设置为委托:

更新mainwindow.cpp中的init()函数

void MainWindow::init()
{QStringList columnNames;columnNames<<"QSpinBox"<<"QComboBox"<<"QCheckBox"<<"QProgressBar"<<"···";model = new QStandardItemModel;model->setRowCount(10);model->setHorizontalHeaderLabels(columnNames);ui->tableView->setModel(model);Delegate *pgbarDelegate = new Delegate;ui->tableView->setItemDelegateForColumn(3,pgbarDelegate);
}

4.5 运行效果

在这里插入图片描述

5 源码

  1. 有钱人通道:电梯
  2. 白嫖通道:评论下方留下你的邮箱或者私信我

都看到这里了,赏个关注吧!


http://www.ppmy.cn/news/22339.html

相关文章

Vue使用Element-UI实现分页效果

前言 分页在展示数据列表的场景肯定是非常多的。 一般的项目开发中&#xff0c;数据量特别大&#xff0c;一般都是后端接口直接处理分页返回&#xff0c;前端直接调用即可。 但是前端也是可以不需要借助后端&#xff0c;自己也是可以处理分页的。今天我这个后端开发就站在前…

【双向带头循环链表】

双向带头循环链表 0.链表中每个节点的基本结构 1.初始化链表&#xff08;创建哨兵位头节点&#xff09; 2.申请新节点 3.尾插节点 4.尾删节点 5.头插节点 6.头删节点 7.寻找pos位置的节点 8.在pos位置之前插入节点 9.删除pos位置的节点 10.打印链表出来 11.销毁链表…

基本运算放大电路采集PT100电路说明

通过采集PT100的电压插值&#xff0c;以及流过PT100的恒流电流&#xff0c;从而求得PT100的阻值。通过查表&#xff0c;可以得到当前温度值。 上图是一个三线制PT100前置放大电路。PT100传感器引出三根材质、线径、长度完全相同的线&#xff0c;接法如上图所示。 有2V的电压加在…

如何使用java调用易班登录API获取个人账号信息(一)

关于这篇文章&#xff1a; 笔者近期和小伙伴接了校方的一个小小小项目&#xff0c;要求使用易班APP的账号&#xff0c;这意味着需要调用易班官方的登录API。下面介绍使用java语言作为后端&#xff0c;在自己的网站如何接入易班的登录API&#xff08;轻应用、移动应用的操作大同…

【目标检测论文解读复现NO.32】基于改进YOLO的飞机起降阶段跟踪方法

前言此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c;…

数据结构第七周 :(稀疏矩阵快速转置 + 简单文本编辑器 + 三元组的矩阵加法 + 九宫格数独游戏 + 数组主元素 + 螺旋数字矩阵 + 蛇形矩阵)

目录稀疏矩阵快速转置简单文本编辑器三元组的矩阵加法九宫格数独游戏数组主元素螺旋数字矩阵蛇形矩阵稀疏矩阵快速转置 【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素&#xff0c;那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个…

关于【多态】这些你都了解吗?

致前行路上的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累&#xff0c;都需要过程&#xff01; 1.多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对…

Lesson 5.2 混淆矩阵与 F1-Score

文章目录一、混淆矩阵与 F1-Score1. 准确率局限2. 混淆矩阵&#xff08;Confusion matrix&#xff09;3. 混淆矩阵中的模型评估指标3.1 围绕识别类别 1 所构建的评估指标3.2 围绕识别类别 0 所构建的评估指标4. 混淆矩阵评估指标使用策略5. 多分类混淆矩阵接下来&#xff0c;我…