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

这篇具有很好参考价值的文章主要介绍了QT中级(2)QTableView自定义委托(二)实现QProgressBar委托。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

同系列文章

QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托
QT中级(2)QTableView自定义委托(二)实现QProgressBar委托
QT中级(3)QTableView自定义委托(三)实现QCheckBox委托并且将QCheckBox居中
QT中级(4)QTableView自定义委托(四)实现QDateTimeEdit、QDateEdit控件
QT高级(1)QTableView自定义委托集合,一个类实现若干委托

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 第一步

文件结构如下:
QT中级(2)QTableView自定义委托(二)实现QProgressBar委托

在设计师界面拖拽一个tableview到MainWindow中,并对其进行初始化。
需要主要的是 void initTable(...);这个函数是我在经常使用QTableView时通用的设置,不仅可以在这个项目使用,也可以在其他项目中使用
QT中级(2)QTableView自定义委托(二)实现QProgressBar委托
代码如下:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QStandardItemModel;
class QTableView;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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);
#else
    tableView->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初始化soPgbar
        soPgbar.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);
    }//if
    else
    {
        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 运行效果

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

5 源码

源码

都看到这里了,赏个关注吧!文章来源地址https://www.toymoban.com/news/detail-736525.html

到了这里,关于QT中级(2)QTableView自定义委托(二)实现QProgressBar委托的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt应用开发(基础篇)——进度条 QProgressBar

             QProgressBar 类继承于QWidget,是一个提供了横向或者纵向进度条的小部件。           QProgressBar 进度条一般用来显示用户某操作的进度,比如 烧录、导入、导出、下发、上传、加载 等这些需要耗时和分包的概念,让用户知道程序还在正常的执行中。       

    2024年02月10日
    浏览(43)
  • 基于Qt数据库项目实现(Sqlite3为例)|考查数据库、表格(QTableView 显示)(进阶)

    01 数据库表格(QTableView 显示) 本小节设计一个生活中的例子,使用数据库修改/查询员工的编号、姓名、年龄、性别与照片信息。 本例将数据库的内容显示到 QTableView 上。如果只是简单的显示数据库的内容到QTableView 上,可以使用下面的方法,此方法 QTableView 上可以看到

    2024年02月20日
    浏览(50)
  • 十二、QProgressBar的简单使用与样式优化(Qt5 GUI系列)

    目录 一、设计需求 二、实现代码 三、代码解析 四、总结 五、扩展(自定义QProgressBar样式)         在很多应用程序中,在执行费时操作时都会展示一个进度条来展示操作进行的进度。常见的场景,如:拷贝操作、安装操作以及卸载操作。本例要求实现进度条简单使用,同

    2024年01月25日
    浏览(37)
  • Qt创建右键菜单的两种通用方法(QTableView实现右键菜单,含源码+注释)

    下图为两种右键菜单实现的示例图,源码在本文第三节(源码含详细注释)。 提示:不会使用Qt设计师设计界面的小伙伴点击这里。 该方法是触发contextMenuEvent事件来实现右键菜单,只需在该事件函数中写入对应的右键菜单代码即可。 该方法是通过控件发出的customContextMenuR

    2024年02月15日
    浏览(50)
  • Qt QTableView滑动、居中、选中加粗

    目录 1.效果: 2.滑动 3.居中 4.选中加粗 5.使用的样式表   在使用触控屏时需要列表或视图能够滑动查看 为滚动区域注册了 鼠标左键的手势识别器,在触摸屏上时可以设置为 QScroller::TouchGesture 触摸手势,很多view都可以实现滑动:QListView,QComboBox下拉框滑动... 也可以自己配置

    2024年02月11日
    浏览(37)
  • 【QT 基础教程 十四】QTableView类解析

    头文件:#includeQTableView 模块:QT += widgets 父类:QAbstractItemView 功能:Qt中的QTableView可以将数据项显示在表格视图中 1.初始化 2.绑定模型 3.添加内容显示 视图是模型的界面显示 ,所以在视图显示内容,需要让模型拿到数据。 4.隐藏行 5.设置行高、列宽 6.获取选中行 7.返回当前

    2024年03月20日
    浏览(72)
  • QT中QTableView对单个单元格操作的方法

    此处举例对单元格操作的读取和写入

    2024年02月16日
    浏览(40)
  • Qt之QTableView显示鼠标悬浮下的项的信息

            业务上遇到一些需求,某个需求是当鼠标移动到QTableView的item上时,显示该item的某些信息。首先想到的思路就是鼠标悬浮事件,即安装QTableView的事件过滤器,然后在eventFilter进行判断即可。实现很简单,主要在针对qt界面处理子界面的事件响应时,主要是还没搞清

    2024年02月13日
    浏览(47)
  • Qt QtableWidget、QtableView表格删除选中行、删除单行、删除多行

    设置 操作 设置 操作 无需设置 setSelectionBehavior(QAbstractItemView::SelectRows) ,但是可以选择的那一列最好设置为不可编辑。按下Ctrl键,选择多行。 设置1 设置2 操作 QTableWidgetSelectionRange是Qt框架中用于表示QTableWidget中选定的一块单元格区域的类。以下是如何使用QTableWidgetSelectionR

    2024年02月01日
    浏览(51)
  • UE4/5多人游戏详解(七、自定义委托,实现寻找会话和加入会话的函数,通过Steam进行两台电脑的联机)

    目录 可能出现问题(在六部分的测试可能无法连接的问题【在末尾加上了,怕有人没看见在这里写一下】) 自定义委托 调整位置 创建更多的委托和回调函数给菜单: 多播和动态多播  代码: 委托变量  代码: 回调函数  代码: 绑定委托和动态函数:  代码: 头文件添加

    2024年02月04日
    浏览(129)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包