2011-07-09 6 views
1

私はQSqlTableModelをデータソースとして使用し、QTableViewを使用してデータを表示しています。 また、QDataWidgetMapperを使用して、別々の形式でデータを編集しています。Qt Model/View Delegation:単純にテキストデータを変換するには?

私がしたいのは、データベース(2011-07-09T18:21:49)の1つのフォーマットの日付/時刻文字列を、テーブル(18:21)と別のフォーマット(09.07.2011 18:21:49)

私はItemDelegateが正しい方法だと思っていますが、絵画などを変更したくありません。どうすれば正しい方法でしょうか?

答えて

2

、あなたはプロキシデータモデルを使用する必要はないと思う私は、これはそれを行うための正しい方法(中間データモデル)かもしれないと思う 今はQItemDelegateを使用しました。 私は次のことを行なったし、それが働いた:

class DateTimeDelegate : public QItemDelegate 
{ 
Q_OBJECT 
public: 
explicit DateTimeDelegate(QObject *parent = 0); 

void setEditorData(QWidget *editor, 
        const QModelIndex &index) const; 

void setModelData(QWidget *editor, 
        QAbstractItemModel *model, 
        const QModelIndex &index) const; 

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

signals: 

public slots: 

}; 

実装:

void DateTimeDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const 
{ 
    if(index.column() == 1 || index.column() == 2) { 
     if (editor->property("text").isValid()) { 
      QDateTime dt = QDateTime::fromString(index.data().toString(), Qt::ISODate); 
      editor->setProperty("text", dt.toString("dd.MM.yyyy hh:mm")); 
     } 
    } else { 
     QItemDelegate::setEditorData(editor, index); 
    } 
} 

void DateTimeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, 
      const QModelIndex &index) const 
{ 
    QDateTime dt = QDateTime::fromString(index.data().toString(), Qt::ISODate); 


    QString time; 
    if(dt.date() == QDate::currentDate()) 
     time = dt.toString("hh:mm"); 
    else 
     time = dt.toString("dd.MM."); 

    painter->save(); 
    painter->setClipRect(option.rect); 

    drawBackground(painter, option, index); 
    drawDisplay(painter, option, option.rect, time); 
    drawFocus(painter, option, option.rect); 

    painter->restore(); 
}