QTableView 格式化数字 [英] QTableView formatting numbers

查看:277
本文介绍了QTableView 格式化数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个代表,我能够对齐和加粗表格上的数字.我想强制它们有两个小数位,例如 1.2 应该显示为 1.20.这是 delagete 的标题:

I have created a delegate and i'm able to align and boldface the numbers on the table. I would like to force them to have two decimal places, for example 1.2 should show as 1.20. This is the header of the delagete:

#ifndef TOTALDELEGATE_H
#define TOTALDELEGATE_H

#include <QObject>
#include <QStyledItemDelegate>


class TotalDelegate : public QStyledItemDelegate
{
public:
  TotalDelegate();

  virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
};

#endif // TOTALDELEGATE_H

这是实现:

#include "totaldelegate.h"

TotalDelegate::TotalDelegate()
{

}

void TotalDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
  if(!index.isValid()) return;
  QFont font=option.font;
  font.setBold(true);

  QStyleOptionViewItem localOption(option);
  localOption.font=font;
  localOption.displayAlignment=Qt::AlignRight;
  QStyledItemDelegate::paint(painter,localOption,index);

}

对于如何控制对齐方式仍然有点迷茫,因此它强制保留两位小数.我也想知道如何更改背景颜色.谢谢您的帮助.这是模型:

Still a little lost on how to control the alignment so it forces two decimals. Also i would like to know how to change the background color. Thanks for the help. Here is the model:

  body = new QSqlTableModel(parent,data->m_db);
  body->setTable("C"+QString::number(markTime.toSecsSinceEpoch()));
  body->select();
  ui->bodyView->setModel(body);
  ui->bodyView->sortByColumn(0,Qt::AscendingOrder);
  ui->bodyView->setColumnWidth(0,30);
  ui->bodyView->setColumnWidth(1,80);
  for(int x=2;x<ui->columns->maximum()+2;x++) ui->bodyView->setColumnWidth(x,40);
  ui->bodyView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  ui->bodyView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  ui->bodyView->setAlternatingRowColors(true);

//  //  ***************  Testing  ********************
  ui->bodyView->setItemDelegateForRow(10,new TotalDelegate);

//  //  *****************Testing  ********************

  ui->bodyView->show();

推荐答案

一种可能的解决方案是创建自定义 QSqlTableModel 类并覆盖 QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const 方法.

One possible solution is to create a custom QSqlTableModel class and override the QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const method.

在设置显示方式的情况下,我们使用 Qt::DisplayRole 角色作为过滤器,如果更改背景颜色,我们将使用 Qt::背景角色:

In the case of setting how it will be shown we use the Qt::DisplayRole role as a filter, and in case of changing the background color we will use the Qt::BackgroundRole:

*.h

#ifndef CUSTOMSQLTABLEMODEL_H
#define CUSTOMSQLTABLEMODEL_H

#include <QSqlTableModel>

class CustomSqlTableModel : public QSqlTableModel
{
public:
    CustomSqlTableModel(QObject *parent = Q_NULLPTR, QSqlDatabase db = QSqlDatabase());

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
};

#endif // CUSTOMSQLTABLEMODEL_H

*.cpp

#include "customsqltablemodel.h"

#include <QBrush>

CustomSqlTableModel::CustomSqlTableModel(QObject *parent, QSqlDatabase db):QSqlTableModel(parent, db)
{

}

QVariant CustomSqlTableModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole){
        if(index.column()  == 4)
            return QVariant(QString::number(QSqlTableModel::data(index, role).toDouble(), 'f', 2));
    }

    if (role == Qt::BackgroundRole){
        if(index.row()  == 4)
            return QVariant(QBrush(Qt::blue));
    }
    return QSqlTableModel::data(index, role);
}

输出:

这篇关于QTableView 格式化数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆