【问题标题】:QTableView formatting numbersQTableView 格式化数字
【发布时间】:2018-01-05 03:43:58
【问题描述】:

我已经创建了一个代表,并且我能够对齐表格上的数字并以粗体显示。我想强制他们保留两位小数,例如 1.2 应该显示为 1.20。 这是 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);

}

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

  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();

【问题讨论】:

  • 你的型号是什么?
  • 我刚刚用模型更新了帖子
  • 您希望所有数字都有小数,还是只有那些已经有小数的数字?
  • @eyllanesc - 是的,我希望所有数字都显示小数。
  • @Scheff - QTableView 中显示的所有数据都来自 SQL 模型。数据库中的所有列都设置为float,“C”+QString::number(markTime.toSecsSinceEpoch()) 仅用于序列化临时工作表的名称。 markTime 是一个 DateTime 对象。

标签: c++ qt qtableview qsqltablemodel


【解决方案1】:

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

在设置显示方式的情况下,我们使用Qt::DisplayRole 角色作为过滤器,在更改背景颜色的情况下,我们将使用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);
}

输出:

【讨论】:

  • 感谢您的回答。这个解决方案的问题是影响整个表格,我只想用背景颜色影响一行。另一件事是您如何使用“,”来分隔 1,000 位?我很难相信这不是一个可以掩盖数字显示的“函数”,例如 Excel 中的“#,##0.00”。
  • 请不要扩展问题,准确的说你想画某种颜色的那一行,标准是什么?
  • 请更具体一些。因为编辑时的模型与显示的不同
  • 谢谢你的回答,我知道你是怎么做到的。我不打算扩展这个问题,这基本上是如何格式化数字以使表格看起来很专业。
  • 我的回答很笼统,您必须根据具体情况调整代码。我帮你回答?
猜你喜欢
  • 2011-04-16
  • 1970-01-01
  • 2017-03-22
  • 2014-04-29
  • 1970-01-01
  • 2017-10-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多