2017-07-29 89 views
2

我已经创建了一个委托,我可以对齐和粗体表中的数字。我想强制他们有两位小数,例如1.2应该显示为1.20。 这是delagete头:QTableView格式编号

#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(); 
+0

你的模型是什么? – eyllanesc

+0

我刚更新了模型的帖子 – Dan3460

+0

你想要所有数字都有小数,还是只有那些已经有小数? – eyllanesc

回答

0

一个可能的解决方案是创建一个自定义的类与QSqlTableModel并重写QVariant QSqlTableModel::data(const QModelIndex &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); 
} 

输出:

enter image description here

+0

感谢您的回答。这个解决方案的问题是影响整个表格,我只想用背景颜色影响一行。其他的事情是,你如何把一个“,”分开1000年?我很难相信,这不是一个可以掩盖数字显示的“函数”,例如Excel中的“#,## 0.00”。 – Dan3460

+0

请不要延长这个问题,准确地说,你想要绘制一个特定颜色的行,标准是什么? – eyllanesc

+0

请更具体。由于模型在编辑时不同于显示器 – eyllanesc