使用QItemDelegate做的实现
有自动更新进度
要在.pro文件里添加
CONFIG += c++11
ProgressBarDelegate类
-
-
-
-
-
-
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:
-
-
-
-
};
-
-
-
-
-
-
-
-
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类
-
-
-
-
-
-
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;
-
-
};
-
-
-
-
-
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类
-
-
-
-
-
-
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;
-
-
};
-
-
-
-
-
-
-
-
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 类
-
-
-
-
-
-
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;
-
};
-
-
-
-
-
-
-
-
-
-
-
-
-
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();
-
}
-
-
}
-
}
-