supertom44
supertom44

Reputation: 53

PyQt Paint Custom Date Format

I'm displaying some information from a sql server in a qtableview using a sqlmodel.

I have set up a custom delegate to deal with the editing of the data.

I would like to display my dates in a specific format, when they table is first loaded the dates are displayed as such: 20011-04-30 But when I edit the date and click off the cell to accept the date is then displayed like: 30/04/2011 Which is how its stored in the database and how I would like it to be displayed to start with, I have no idea why it changes format once its been edited.

I'm guessing I have to reimplement the paint method for that column I have done something similar with a progress bar but I have no idea how to do it for text.

Here is my delegate as it stands, note is has some editors set up for other columns but my main question only relates to how to display the date correctly.

import sys
import os

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSql import *

PROJECTID, PROJECTTITLE, CLIENTID, DEADLINE, PROGRESS, ROOT = range(6)

class projectsDelegate(QSqlRelationalDelegate):
     def __ini__(self, parent = None):
    super(projectsDelegate, self).__init__(parent)

def createEditor(self, parent, option, index):
    if index.column() == DEADLINE:
        editor = QDateEdit(parent)
        #editor.setDisplayFormat("yyyy/MM/dd")
        editor.setMinimumDate(QDate.currentDate())
        editor.setCalendarPopup(True)
        return editor
    elif index.column() == PROGRESS:
        editor = QSpinBox(parent)
        editor.setRange(0, 100)
        editor.setSingleStep(5)
        editor.setSuffix("%")
        return editor
    elif index.column() == ROOT:
        editor = QFileDialog(parent)
        editor.setFileMode(QFileDialog.Directory)
        editor.setOptions(QFileDialog.ShowDirsOnly)
        editor.setFixedSize(400, 400)
        editor.setWindowTitle("Select A Root Folder For The Project")
        return editor
    else:
        return QSqlRelationalDelegate.createEditor(self, parent, option, index)

def setEditorData(self, editor, index):
    if index.column() == DEADLINE:
        text = index.model().data(index, Qt.DisplayRole).toDate()
        editor.setDate(text)
    elif index.column() == PROGRESS:
        prog = index.model().data(index, Qt.DisplayRole).toInt()[0]
        editor.setValue(prog)
    elif index.column() == ROOT:
        root = index.model().data(index, Qt.DisplayRole).toString()
        editor.setDirectory(os.path.dirname(str(root)))
        screen = QDesktopWidget().screenGeometry()
        size = editor.geometry()
        editor.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
    else:
        QSqlRelationalDelegate.setEditorData(self, editor, index)

def setModelData(self, editor, model, index):
    if index.column() == DEADLINE:
        model.setData(index, QVariant(editor.date()))
    elif index.column() == PROGRESS:
        model.setData(index, QVariant(editor.value()))
    elif index.column() == ROOT:
        model.setData(index, QVariant(editor.directory().absolutePath()))
    else:
        QSqlRelationalDelegate.setModelData(self, editor, model, index)

def paint(self, painter, option, index):
    if index.column() == PROGRESS:
        bar = QStyleOptionProgressBarV2()
        bar.rect = option.rect
        bar.minimum = 0
        bar.maximum = 100
        bar.textVisible = True
        percent = index.model().data(index, Qt.DisplayRole).toInt()[0]
        bar.progress = percent
        bar.text = QString("%d%%" % percent)
        QApplication.style().drawControl(QStyle.CE_ProgressBar, bar, painter) 
    else:
        QSqlRelationalDelegate.paint(self, painter, option, index)

def sizeHint(self, options, index):
    if index.column() == PROGRESS:
        return QSize(150, 30)
    elif index.column() == ROOT:
        return QSize(400, 800)
    else:
        return QSqlRelationalDelegate.sizeHint(self, options, index)

Thanks, Tom.

Upvotes: 2

Views: 1669

Answers (1)

Stephen Terry
Stephen Terry

Reputation: 6279

Why is editor.setDisplayFormat("yyyy/MM/dd") commented out? Shouldn't that take care of the formatting?

Upvotes: 1

Related Questions