2017-07-29 3 views
2

J'ai créé un délégué et je suis en mesure d'aligner et de mettre en gras les numéros sur la table. Je voudrais les forcer à avoir deux décimales, par exemple 1.2 devrait montrer comme 1.20. Ce est l'en-tête du delagete:QTableView nombres de mise en forme

#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 

Voici la mise en œuvre:

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

} 

Encore un peu perdu sur la façon de contrôler l'alignement il force deux décimales. Aussi, je voudrais savoir comment changer la couleur de fond. Merci pour l'aide. Voici le modèle:

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

Quel est votre modèle? – eyllanesc

+0

Je viens de mettre à jour le poste avec le modèle – Dan3460

+0

Voulez-vous que tous les nombres aient des nombres décimaux, ou seulement ceux qui ont déjà des nombres décimaux? – eyllanesc

Répondre

0

Une solution possible est de créer une classe de QSqlTableModel personnalisée et remplacer la méthode QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const.

Dans le cas de la mise en comment il sera montré que nous utilisons le rôle Qt::DisplayRole comme un filtre, et en cas de changement de la couleur de fond, nous utiliserons les 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); 
} 

sortie:

enter image description here

+0

Merci pour la réponse. Le problème avec cette solution est que cela affecte la table entière, je veux seulement affecter une ligne avec la couleur de fond. Une autre chose est de savoir comment mettre un "," pour séparer les 1000? Est-ce difficile pour moi de croire que ce n'est pas une "fonction" qui peut masquer l'affichage des nombres, comme dans Excel "#, ## 0.00" par exemple. – Dan3460

+0

S'il vous plaît ne pas étendre la question, pour être précis que la ligne que vous voulez être peint d'une certaine couleur, quel est le critère? – eyllanesc

+0

Soyez plus précis s'il vous plaît. Parce que le modèle est différent au moment de l'édition que l'affichage – eyllanesc