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

打印 上一主题 下一主题

主题 917|帖子 917|积分 2751

同系列文章

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

文件结构如下:

在设计师界面拖拽一个tableview到MainWindow中,并对其进行初始化。
需要主要的是 void initTable(...);这个函数是我在经常使用QTableView时通用的设置,不仅可以在这个项目使用,也可以在其他项目中使用

代码如下:
mainwindow.h
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. class QStandardItemModel;
  5. class QTableView;
  6. QT_BEGIN_NAMESPACE
  7. namespace Ui { class MainWindow; }
  8. QT_END_NAMESPACE
  9. class MainWindow : public QMainWindow
  10. {
  11.     Q_OBJECT
  12. public:
  13.     MainWindow(QWidget *parent = nullptr);
  14.     ~MainWindow();
  15.     void init();
  16.     //设置表格
  17.     void initTable(QTableView *tableView,int rowHeight = 25,bool Editable=false,bool isSorting = false,bool verticalHeadVisible=false,
  18.             bool isLastTensile = true,bool isShowGrid = true);
  19. private:
  20.     Ui::MainWindow *ui;
  21.     QStandardItemModel *model;
  22. };
  23. #endif // MAINWINDOW_H
复制代码
mainwindow.cpp
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QStandardItemModel>
  4. MainWindow::MainWindow(QWidget *parent)
  5.     : QMainWindow(parent)
  6.     , ui(new Ui::MainWindow)
  7. {
  8.     ui->setupUi(this);
  9.     this->initTable(ui->tableView,27,true);
  10.     this->init();
  11. }
  12. MainWindow::~MainWindow()
  13. {
  14.     delete ui;
  15. }
  16. void MainWindow::init()
  17. {
  18.     QStringList columnNames;
  19.     columnNames<<"QSpinBox"<<"QComboBox"<<"QCheckBox"<<"QProgressBar"<<"···";
  20.     model = new QStandardItemModel;
  21.     model->setRowCount(10);
  22.     model->setHorizontalHeaderLabels(columnNames);
  23.     ui->tableView->setModel(model);
  24. }
  25. void MainWindow::initTable(QTableView *tableView,int rowHeight,bool Editable,bool isSorting,bool verticalHeadVisible,bool isLastTensile,bool isShowGrid)
  26. {
  27.     /*设置样式*/
  28.     tableView->setProperty("model",true);
  29.     /*设置默认行高*/
  30.     tableView->verticalHeader()->setDefaultSectionSize(rowHeight);
  31.     /*设置交替行颜色--允许交替行颜色*/
  32.     tableView->setAlternatingRowColors(true);
  33.     /*设置水平/垂直滚动模式--一次滚动一个项目*/
  34.     tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);
  35.     tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
  36.     /*设置选择行为--每次选择只有一整行*/
  37.     tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  38.     /*设置拖放行为--不允许拖放*/
  39.     tableView->setDragDropMode(QAbstractItemView::NoDragDrop);
  40.     /*设置选择模式--只能选择一个项目*/
  41.     tableView->setSelectionMode(QAbstractItemView::SingleSelection);
  42.     /*设置Tab导航键--允许使用Tab键导航,shift+tab反向导航*/
  43.     tableView->setTabKeyNavigation(true);
  44.     /*设置是否自动换行--取消自动换行*/
  45.     tableView->setWordWrap(false);
  46.     /*设置文本省略模式--省略号不会出现在文本中*/
  47.     tableView->setTextElideMode(Qt::ElideNone);
  48.     /*设置左上角全选按钮--禁用*/
  49.     tableView->setCornerButtonEnabled(false);
  50.     /*设置是否支持表头排序--应该和表头是否可以单击保持一致*/
  51.     tableView->setSortingEnabled(isSorting);
  52.     /*设置是否显示网格线*/
  53.     tableView->setShowGrid(isShowGrid);
  54.     /*设置垂直表头是否可见*/
  55.     tableView->verticalHeader()->setVisible(verticalHeadVisible);
  56.     /*设置选中一行表头是否加粗--不加粗*/
  57.     tableView->horizontalHeader()->setHighlightSections(false);
  58.     /*设置最后一行是否拉伸填充*/
  59.     tableView->horizontalHeader()->setStretchLastSection(isLastTensile);
  60.     /*设置行标题最小宽度尺寸*/
  61.     tableView->horizontalHeader()->setMinimumSectionSize(0);
  62.     /*设置行标题最小高度*/
  63.     tableView->horizontalHeader()->setFixedHeight(rowHeight);
  64.     /*设置表头是否可以单击--不可单击*/
  65. #if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
  66.     tableView->horizontalHeader()->setSectionsClickable(isSorting);
  67. #else
  68.     tableView->horizontalHeader()->setClickable(false);
  69. #endif
  70.     /*是否可编辑*/
  71.     if(Editable)
  72.     {
  73.         tableView->setEditTriggers(QAbstractItemView::CurrentChanged|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed);
  74.     }
  75.     else
  76.     {
  77.         tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  78.     }
  79. }
复制代码
4.2 第二步


  • 我们首先创建一个类Delegate继承QStyledItemDelegate,同时定义paint函数
  1. void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
复制代码
这四个函数的作用以及意义,详见:《QT(7)-初识委托》这里不在赘述。

  • 创建一些  QSpinBox相关参数,并创建相应参数的外部设置接口
  1.     /*QProgressBar设置相关参数函数*/
  2.     void setPgBarRange(const int min,const int max);
  3.     void setPgBarTextVisible(bool isTextVisible);
  4.     void setPgBarAlignment(Qt::Alignment pgbarAlignment);
  5.     void setInvertedAppearance(bool invertedAppearance);
  6.     /*QProgressBar相关参数*/
  7.     int pgbarMax;
  8.     int pgbarMin;
  9.     Qt::Alignment pgbarAlignment;
  10.     bool isTextVisible;
  11.     bool invertedAppearance;
  12.     QProgressBar *pgBar;
复制代码
这里我定义了很多参数,实际应用的时候有些参数并用不到,大家根据需求定义。

  • 创建给这些参数初始化的函init()
  1. void Delegate::init()
  2. {
  3.     pgBar = new QProgressBar;
  4.     pgbarMax = 100;
  5.     pgbarMin = 0;
  6.     pgbarAlignment = Qt::AlignCenter;
  7.     isTextVisible = true;
  8.     invertedAppearance = false;
  9. }
复制代码
4.3 第三步

下面我们逐个实现paint函数
  1. void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
  2. {
  3.     if(index.column() == 3)
  4.     {
  5.         //获得视图中的值
  6.         int value = index.model()->data(index,Qt::DisplayRole).toInt();
  7.         //创建包含QProgressBar样式信息类
  8.         QStyleOptionProgressBar soPgbar;
  9.         //使用我们创建的pgBar初始化soPgbar
  10.         soPgbar.initFrom(pgBar);
  11.         //设置最大值和最小值
  12.         soPgbar.maximum = pgbarMax;
  13.         soPgbar.minimum = pgbarMin;
  14.         //设置进度条值
  15.         soPgbar.progress = value;
  16.         //设置状态
  17.         soPgbar.state |= QStyle::State_Enabled;
  18.         soPgbar.state |= QStyle::State_Horizontal;
  19.         //设置位置和大小
  20.         soPgbar.rect = option.rect;
  21.         //设置文本
  22.         soPgbar.text = QString("%1%").arg(value);
  23.         //设置文本是否可见
  24.         soPgbar.textVisible = isTextVisible;
  25.         //设置文本居中
  26.         soPgbar.textAlignment = pgbarAlignment;
  27.         //设置进度条的进度方向
  28.         soPgbar.invertedAppearance = invertedAppearance;
  29.         //绘制
  30.         QApplication::style()->drawControl(QStyle::CE_ProgressBar,&soPgbar,painter,pgBar);
  31.     }//if
  32.     else
  33.     {
  34.         QStyledItemDelegate::paint(painter,option,index);
  35.     }
  36. }
复制代码
4.4 最后一步

我们需要在mainwindow.cpp中的init()调用delegate类实现委托。我们将QTableView的第一列设置为委托:
更新mainwindow.cpp中的init()函数
[code]void MainWindow::init(){    QStringList columnNames;    columnNames

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

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