2017-07-29 87 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