Python 如何设置用作qdelegate的Qdatetimeedit的默认值

Python 如何设置用作qdelegate的Qdatetimeedit的默认值,python,qtableview,qabstracttablemodel,Python,Qtableview,Qabstracttablemodel,我在QTableview上使用QDateTimeEdit作为代理来显示开始日期和结束日期。 当我尝试填充从数据库接收的数据时,QDateTimeEdit委托不会显示它 这是我的密码: 类DateDelegate: class DateDelegate(QtGui.QItemDelegate): def __init__(self, parent): QtGui.QItemDelegate.__init__(self, parent) def createEdi

我在QTableview上使用QDateTimeEdit作为代理来显示开始日期和结束日期。 当我尝试填充从数据库接收的数据时,QDateTimeEdit委托不会显示它

这是我的密码:

DateDelegate

class DateDelegate(QtGui.QItemDelegate):

    def __init__(self, parent):
        QtGui.QItemDelegate.__init__(self, parent)

    def createEditor(self, parent, option, index):
        self.dateEdit = QtGui.QDateTimeEdit(parent)
        self.dateEdit.setCalendarPopup(True)
        self.dateEdit.setMinimumDate(QtCore.QDate(2014, 03, 01))
        self.dateEdit.setDisplayFormat(_translate("Form", "dd/mm/yyyy", None))
        return self.dateEdit

    def setModelData(self, editor, model, index):
        value = self.dateEdit.dateTime().toPyDateTime()
        strDate = value.strftime('%d/%m/%Y') 
        model.setData(index, strDate, QtCore.Qt.EditRole)
资产模型

class AssetTableModel(QtCore.QAbstractTableModel):

    def __init__(self, assets = [], headers = [], parent = None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self.__assets = assets
        self.__headers = headers

    def rowCount(self, parent):
        return len(self.__assets)

    def columnCount(self, parent):
        return len(self.__assets[0])

    def flags(self, index):
        return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable

    def data(self, index, role):
        row = index.row()
        column = index.column()

        if role == QtCore.Qt.EditRole:
            return self.__assets[row][column]

        if role == QtCore.Qt.DisplayRole:
            print self.__assets[row][column]
            return self.__assets[row][column]

    def setData(self, index, value, role = QtCore.Qt.EditRole):
        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()

            self.__assets[row][column] = value
            self.dataChanged.emit(index, index)
            return True
        return False

    def headerData(self, section, orientation, role):
        if role == QtCore.Qt.DisplayRole:
            if orientation == QtCore.Qt.Horizontal:
                if section < len(self.__headers):
                    return self.__headers[section]
                else:
                    return "not implimented"
            else:
                return "verticle not implimented"


    def insertRows(self, position, rows, parent = QtCore.QModelIndex()):
        self.beginInsertRows( parent, position, position + rows - 1 )
        for i in range(rows):
            defaultValues = [ "" for c in range( self.columnCount( None ) ) ] 
            self.__assets.insert( position, defaultValues )
        self.endInsertRows()
        return True

我认为您缺少ItemDelegate中的
setEditorData()
方法

从所附的源代码中,我假设您将日期存储为字符串?在我看来,最好使用QDateTime对象来存储日期/时间。如果这样做,就不需要ItemDelegate来提供适当的编辑器,因为Qt知道需要为这种数据类型提供哪个编辑器。(见附件)

但是,如果仍然希望将日期存储为字符串,请参阅下面的示例程序,了解如何使用delegtes

from PyQt4 import QtCore
from PyQt4 import QtGui

import sys

class myModel(QtCore.QAbstractTableModel):
    def __init__(self, parent):
        QtCore.QAbstractTableModel.__init__(self, parent)

        self.lst = []

        #populate with a few dummy dates
        #store dates as str values
        dateTime = QtCore.QDateTime.currentDateTime()
        for i in range(10):
            strDate = dateTime.toString("dd/mm/yyyy")
            self.lst.append([strDate])
            dateTime = dateTime.addDays(1)


    def rowCount(self, parent = QtCore.QModelIndex()):
        return len(self.lst)

    def columnCount(self, parent = QtCore.QModelIndex()):
        return 1

    def data(self, index, role = QtCore.Qt.DisplayRole):
        row = index.row()
        col = index.column()
        if role == QtCore.Qt.DisplayRole:
            return self.lst[row][col]

        if role == QtCore.Qt.EditRole:
            return self.lst[row][col]

    def setData(self, index, value, role = QtCore.Qt.EditRole):
        row = index.row()
        col = index.column()
        self.lst[row][col] = value

    def flags(self, index):
        return (QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable)


class DateDelegate(QtGui.QItemDelegate):
    def __init__(self, parent):
        QtGui.QItemDelegate.__init__(self, parent)

    def createEditor(self, parent, option, index):
        dateTimeEdit = QtGui.QDateTimeEdit(parent) #create new editor

        #set properties of editor
        dateTimeEdit.setDisplayFormat("dd/mm/yyyy") 
        dateTimeEdit.setCalendarPopup(True)

        return dateTimeEdit

    def setModelData(self, editor, model, index):
        value = editor.dateTime().toString("dd/mm/yyyy")
        model.setData(index, value)

    def setEditorData(self, editor, index):
        value = index.model().data(index, QtCore.Qt.EditRole)
        qdate = QtCore.QDateTime().fromString(value, "dd/mm/yyyy")
        editor.setDateTime(qdate)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    table = QtGui.QTableView()
    data = myModel(table)
    table.setModel(data)

    d = DateDelegate(table)
    table.setItemDelegateForColumn(0, d)

    table.resize(800, 600)
    table.show()

    sys.exit(app.exec_())

我找到了答案,在这里提到,如果有人遇到同样的问题。我要做的是将datetime对象(我从db获得)更改为字符串。感谢您的回复。我尝试实现了“SetEditorData”但是我从DB接收到的数据是datetime对象而不是字符串。现在它对我有效,如果我不在这里实现“SetEditorData”,会有问题吗?还是可以?
from PyQt4 import QtCore
from PyQt4 import QtGui

import sys

class myModel(QtCore.QAbstractTableModel):
    def __init__(self, parent):
        QtCore.QAbstractTableModel.__init__(self, parent)

        self.lst = []

        #populate with a few dummy dates
        #store dates as str values
        dateTime = QtCore.QDateTime.currentDateTime()
        for i in range(10):
            strDate = dateTime.toString("dd/mm/yyyy")
            self.lst.append([strDate])
            dateTime = dateTime.addDays(1)


    def rowCount(self, parent = QtCore.QModelIndex()):
        return len(self.lst)

    def columnCount(self, parent = QtCore.QModelIndex()):
        return 1

    def data(self, index, role = QtCore.Qt.DisplayRole):
        row = index.row()
        col = index.column()
        if role == QtCore.Qt.DisplayRole:
            return self.lst[row][col]

        if role == QtCore.Qt.EditRole:
            return self.lst[row][col]

    def setData(self, index, value, role = QtCore.Qt.EditRole):
        row = index.row()
        col = index.column()
        self.lst[row][col] = value

    def flags(self, index):
        return (QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable)


class DateDelegate(QtGui.QItemDelegate):
    def __init__(self, parent):
        QtGui.QItemDelegate.__init__(self, parent)

    def createEditor(self, parent, option, index):
        dateTimeEdit = QtGui.QDateTimeEdit(parent) #create new editor

        #set properties of editor
        dateTimeEdit.setDisplayFormat("dd/mm/yyyy") 
        dateTimeEdit.setCalendarPopup(True)

        return dateTimeEdit

    def setModelData(self, editor, model, index):
        value = editor.dateTime().toString("dd/mm/yyyy")
        model.setData(index, value)

    def setEditorData(self, editor, index):
        value = index.model().data(index, QtCore.Qt.EditRole)
        qdate = QtCore.QDateTime().fromString(value, "dd/mm/yyyy")
        editor.setDateTime(qdate)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    table = QtGui.QTableView()
    data = myModel(table)
    table.setModel(data)

    d = DateDelegate(table)
    table.setItemDelegateForColumn(0, d)

    table.resize(800, 600)
    table.show()

    sys.exit(app.exec_())