PyQt рисует пользовательский формат даты

#python #delegates #pyqt

#python #делегаты #pyqt

Вопрос:

Я отображаю некоторую информацию с сервера sql в qtableview с использованием sqlmodel.

Я настроил пользовательский делегат для редактирования данных.

Я хотел бы отображать свои даты в определенном формате, при первой загрузке таблицы даты отображаются как таковые: 20011-04-30 Но когда я редактирую дату и щелкаю по ячейке, чтобы принять, дата отображается следующим образом: 30/04/2011 Именно так она хранится в базе данных и как я хотел бы, чтобы она отображалась для начала, я понятия не имею, почему она меняет формат после ее редактирования.

Я предполагаю, что мне нужно переопределить метод рисования для этого столбца. Я сделал что-то подобное с индикатором выполнения, но я понятия не имею, как это сделать для текста.

Вот мой делегат в его нынешнем виде, обратите внимание, что некоторые редакторы настроены для других столбцов, но мой главный вопрос касается только того, как правильно отображать дату.

 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)
  

Спасибо, Том.

Ответ №1:

Почему editor.setDisplayFormat(«гггг / ММ / дд») закомментирован? Разве это не должно позаботиться о форматировании?

Комментарии:

1. Вот почему я добавил его в первую очередь, я думал, что это решит проблему, но, похоже, это не имеет никакого значения, если он включен или выключен, или установлен в разные форматы, я все равно получаю те же результаты.