QTableView 添加进度条

记录一下QTableView添加进度条

例子很小,仅供学习

使用QItemDelegate做的实现

有自动更新进度

要在.pro文件里添加

CONFIG   += c++11
ProgressBarDelegate类
#ifndef PROGRESSBARDELEGATE_H
#define PROGRESSBARDELEGATE_H

#include <QItemDelegate>

class ProgressBarDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    explicit ProgressBarDelegate(QObject *parent = 0);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

signals:

public slots:

};

#endif // PROGRESSBARDELEGATE_H
#include "progressbardelegate.h"

#include <QPainter>
#include <QApplication>

ProgressBarDelegate::ProgressBarDelegate(QObject *parent) :
    QItemDelegate(parent)
{
}

void ProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(index.column() == 1) {
        int value = index.model()->data(index).toInt();
        QStyleOptionProgressBarV2 progressBarOption;
        progressBarOption.rect = option.rect.adjusted(4, 4, -4, -4);
        progressBarOption.minimum = 0;
        progressBarOption.maximum = 100;
        progressBarOption.textAlignment = Qt::AlignRight;
        progressBarOption.textVisible = true;
        progressBarOption.progress = value;
        progressBarOption.text = tr("%1%").arg(progressBarOption.progress);

        painter->save();
        if (option.state & QStyle::State_Selected) {
            painter->fillRect(option.rect, option.palette.highlight());
                    painter->setBrush(option.palette.highlightedText());
        }
                QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);

        painter->restore();

    } else {
        return QItemDelegate::paint (painter, option, index);
    }
}
TableModel类
#ifndef TABLEMODEL_H
#define TABLEMODEL_H

#include <QAbstractTableModel>

class TableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit TableModel(QObject *parent = 0);
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    void setHorizontalHeader(const QStringList& headers);
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    void setData(const QVector<QStringList>& data);
    QVector<QStringList>& DataVector() {return m_data;}
    ~TableModel(void);

signals:

public slots:

private:
    QStringList m_HorizontalHeader;
    QVector<QStringList> m_data;

};

#endif // TABLEMODEL_H
#include "tablemodel.h"

TableModel::TableModel(QObject *parent) :
    QAbstractTableModel(parent)
{
}

TableModel::~TableModel()
{

}

int TableModel::rowCount(const QModelIndex &parent) const
{
    return m_data.size();
}

int TableModel::columnCount(const QModelIndex &parent) const
{
    return m_HorizontalHeader.count();
}

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if (role == Qt::DisplayRole) {
        int ncol = index.column();
        int nrow =  index.row();
        QStringList values = m_data.at(nrow);
        if (values.size() > ncol)
            return values.at(ncol);
        else
        return QVariant();
    }
    return QVariant();
}

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::NoItemFlags;

    Qt::ItemFlags flag = QAbstractItemModel::flags(index);

    // flag|=Qt::ItemIsEditable // 设置单元格可编辑,此处注释,单元格无法被编辑
    return flag;
}

void TableModel::setHorizontalHeader(const QStringList &headers)
{
    m_HorizontalHeader =  headers;
}

QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
        return m_HorizontalHeader.at(section);
    }
    return QAbstractTableModel::headerData(section, orientation, role);
}

void TableModel::setData(const QVector<QStringList> &data)
{
    m_data = data;
}
TableView类
#ifndef TABLEVIEW_H
#define TABLEVIEW_H

#include <QTableView>

class TableModel;
class ProgressBarDelegate;

class TableView : public QTableView
{
    Q_OBJECT
public:
    explicit TableView(QWidget *parent = 0);
    TableModel* tableModel() {return m_model;}

    ~TableView();

signals:

public slots:

private:
    void iniData();

private:
    TableModel *m_model;
    ProgressBarDelegate *m_progressBarDelegate;

};

#endif // TABLEVIEW_H
#include "tableview.h"

#include "tablemodel.h"
#include "progressbardelegate.h"

TableView::TableView(QWidget *parent) :
    QTableView(parent)
{
    iniData();
}

TableView::~TableView()
{
    delete m_model;
}

void TableView::iniData()
{
    m_model = new TableModel();
    this->setModel(m_model);
    QStringList headers;
    headers << "Id" << "Progress";
    m_model->setHorizontalHeader(headers);

    QVector<QStringList> data;
    data.append(QStringList() << "1" << "22");
    data.append(QStringList() << "2" << "32");
    data.append(QStringList() << "3" << "2");
    data.append(QStringList() << "4" << "80");
    data.append(QStringList() << "5" << "40");
    m_model->setData(data);

    m_progressBarDelegate = new ProgressBarDelegate(this);
    this->setItemDelegate(m_progressBarDelegate);
    emit m_model->layoutChanged();
    this->setColumnWidth(1, 500);
}
MainWindow 类
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class TableView;
class QTimer;

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    void init();
    void initTimer();

public slots:
    void updateProgressValue();

private:
    TableView *tv;
    QTimer *timer;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"

#include "tableview.h"
#include "tablemodel.h"

#include <QLayout>
#include <QVBoxLayout>
#include <QTimer>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
{
    init();
    initTimer();
}

MainWindow::~MainWindow()
{
    delete tv;
    delete timer;
}

void MainWindow::init()
{
    this->resize(800, 600);
    tv = new TableView(this);
    QVBoxLayout* layout = new QVBoxLayout();

    layout->addWidget(tv);
    this->setLayout(layout);
    //this->layout()->addWidget(tv);

}

void MainWindow::initTimer()
{
    timer = new QTimer(this);
    timer->setInterval(1000);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateProgressValue()));
    timer->start();
}

void MainWindow::updateProgressValue()
{
    TableModel* model = tv->tableModel();
    QVector<QStringList>& data = model->DataVector();
    for (QStringList& v : data) {
        int value =v.at(1).toInt();
        qDebug() << value;
        if (value < 100) {
            value += 2;
            qDebug() << value;
            v[1] = QString::number(value);
            emit model->layoutChanged();
        }

    }
}
github:

https://github.com/lpxxn/QTableViewAddProgressBar/tree/master/TableViewAddProgressDemo
时间: 2024-10-10 15:31:21

QTableView 添加进度条的相关文章

EasyUI添加进度条

EasyUI添加进度条 添加进度条重点只有一个,如何合理安排进度刷新与异步调用逻辑,假如我们在javascript代码中通过ajax或者第三方框架dwr等对远程服务进行异步调用,实现进度条就需要做到以下三点: 在异步刷新之前打开进度条 异步刷新的过程中不断的刷新进度数据 异步刷新之后关闭进度条 详细代码 代码如下所示: <div id="a" class="easyui-dialog" title="进度" data-options=&qu

电力项目七--运行监控中添加进度条

<%@ page language="java" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!-- 添加标签,然后做栈顶获取数据 --> <html> <head> <title>运行监控模块编辑</title> <link href="

QStandardItemModel简单好用,QTableView带进度条

类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据.与此不同,类QStandardItemModel负责保存数据,每个数据项被表示为类QStandardItem的对象.我们首先阐述如何使用类QStandardItem保存一个数据项,再阐述如何使用类QStandardItemModel将这些数据项组织起来,形成列表.表格或者树,以供其他视图类显示. 理论参考

MFC 任务栏添加进度条

1.在框架类中添加成员变量CProgressCtrl  m_progress; 2.在框架类OnCreate函数后面添加 CRect rect; //创建CRect对象 m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect); //获得一个指定索引的指示器的矩形区域 m_progress.Create(PBS_SMOOTH|WS_CHILD|WS_VISIBLE,rect,&m_wndSta

电力项目十二--运行监控中添加进度条

应用场景: 1.文件上传.下载(IO流); 2.数据的导入导出: 3.大批量数据的增删改查: 4.远程数据的访问. 添加函数loading(); <%@ page language="java" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!-- 添加标签,然后做栈顶获取数据 --> <html&

DevExpress GridControl 单元格添加进度条(ProgressBar)

首先可以使用DevExpress GridControl 自带的进度条控件. 但是我要用一个方法来设置所以的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. 那么就要自己手动的编写代码来完成了. 1 : 绘制一个单元格进度条 形状   当进度小于50%时显示为红色. 1 public void DrawProgressBar(DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) 2 {

在DevExpress GridControl中添加进度条控件 z

首先可以使用 DevExpress GridControl 自带的进度条控件. 但是我要用一个方法来设置所有的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. 那么就要自己手动的编写代码来完成了. 1 .绘制一个单元格进度条形状,当进度小于50%时显示为红色. public void DrawProgressBar(DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { string

easyui在table单元格中添加进度条

function XR_jd(alue, rowData, rowIndex){ var value; ...... var htmlstr = '<div class="easyui-progressbar progressbar" style="width: 100%; height: 20px;" value="' + value + '" text="' + value + '%">' + '<div

CProgressCtrl进度条

CProgressCtrl进度条 使用方法总结 标签: CProgressCtrlmfc 2016-03-03 09:19 762人阅读 评论(0) 收藏 举报  分类: MFC(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] CProgressCtrl 控件属性 当我们在处理大程序时,常常需要耗很长时间(比如搜索内存,复制大文件),为了不让用户错误的认为系统已经死机,我们要给程序添加进度条. CProgressCtrl 类常用成员函数 SetRange voi