2017-02-19 20 views
0

Это моя проблема:Qt. Метод DisplayText() не работает, если я определил краску() метод в QStyledItemDelegate

У меня есть делегат, полученный из QStyledItemDelegate, где я определил методы

QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem&option, const QModelIndex&index) const; 
void setEditorData(QWidget * editor, const QModelIndex&index)const; 
void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex&index) const; 
QString displayText(const QVariant & value, const QLocale & locale) const; 

Последних method -displayText() - Позвольте мне форматировать вывод чисел в испанском языке, и он отлично работает.

Но после этого я создаю другого делегата из наследования первого делегата. В этом классе я только определить следующие методы:

void paint(QPainter *painter,const QStyleOptionViewItem &option, const QModelIndex &index) const; 
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; 

И проблема в том, что столбцы, где работает тот делегат, не показывают номера хорошо отформатированные как DisplayText() должно быть сделать.

Таким же образом, если я определил оба этих метода (displayText() и paint()) в том же классе, displayText() не работает.

Редактировать:

Эти реализации методов:

DisplayText() в базовом классе:

QString Delegado::displayText(const QVariant & value, const QLocale & locale) const 
{ 
    qDebug()<<"Valor: "<<value.toString()<<"locale - "<<locale; 
    return locale.toString(value.toDouble(),'f',2); 
} 

краски() и sizeHint() в производном классе (я попытались реализовать эти методы в базовом классе, и результаты те же)

void Delegado2::paint(QPainter *painter,const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    if (index.isValid()) 
    { 
     painter->save(); 
     painter->setPen(QColor(255,255,170)); 
     painter->setBrush(QColor(255,255,170)); 
     painter->drawRect(option.rect); 
     painter->setPen(Qt::gray); 
     painter->drawText(option.rect, Qt::AlignCenter, QString::number(index.data().toDouble())); 
     painter->restore(); 
     QStyledItemDelegate::paint(painter, option, index); 
    } 
    else 
     QStyledItemDelegate::paint(painter, option, index); 
} 

    QSize Delegado2::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const 
    { 
     return option.rect.size(); 
    } 
+0

вы называете родительский класс QStyledItemDelegate :: краска() осуществление внутри вашей реализации краски? –

+0

Да. Даже если методы paint() и dispayText() находятся в одном классе, displayText() не работает. – user3733164

+0

Просьба предоставить реализацию метода paint() и displayText() –

ответ

0

Это мое решение. Это работает, но я не знаю, правильно ли это путь. Во-первых, я определяю метод displayText() в деле Delegado (полученный из QStyledItemDelegate). Это мой базовый класс, и он позволяет мне получать номера в моем формате локали.

После того, как в Delegalle2 (полученный от Делладо) я определил методы paint() и sizeHint(). краска() используется метод DisplayText() для вывода текста, как показано ниже:

painter->drawText(option.rect, Qt::AlignCenter|Qt::AlignRight, displayText(index.data(),QLocale::system())); 

Это метод DisplayText() в базовом классе (Delegado):

QString Delegado::displayText(const QVariant & value, const QLocale & locale) const 
{ 
    return locale.toString(value.toDouble(),'f',2); 
} 

И это метод краски() в производном классе (Delegado2)

void Delegado2::paint(QPainter *painter,const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    if (index.isValid()) 
    { 
     painter->save(); 
     painter->setPen(QColor(255,240,170)); 
     painter->setBrush(QColor(255,240,170)); 
     painter->drawRect(option.rect); 
     painter->setPen(Qt::magenta); 
     painter->drawText(option.rect, Qt::AlignCenter|Qt::AlignRight, displayText(index.data(),QLocale::system())); 
     painter->restore(); 
    } 
    else 
    { 
     QStyledItemDelegate::paint(painter, option, index); 
    } 
}