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

时间:2014-03-13 12:11:27

标签: python qtableview qabstracttablemodel

我在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)

班级AssetTableModel

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

班级AssetWidget

class AssetWidget(QtGui.QDialog):

    def __init__(self, parent = None):
        super(AssetWidget, self).__init__(parent)
        uic.loadUi(uipath+'/AssetTable.ui', self)

        # DB call here 
        self.loadAssetData()
        # db call ends here 

        self.model = None
        self.fillCombo(self.assetType)
        self.cellDelegate  = CellDelegate(self)

        for i in range(10):
            self.assetTV.setItemDelegateForColumn(i, self.cellDelegate)

        self.sDateDelegate = DateDelegate(self)
        self.assetTV.setItemDelegateForColumn(10, self.sDateDelegate )
        self.assetTV.setItemDelegateForColumn(11, self.sDateDelegate)

        self.connect(self.assettypeCB, QtCore.SIGNAL("currentIndexChanged(int)"), self.loadAssets )
        self.connect(self.closeBTN , QtCore.SIGNAL("clicked()"), self.close )
        self.connect(self.addRowBTN, QtCore.SIGNAL("clicked()"), self.addRow )
        self.connect(self.assetTV, QtCore.SIGNAL("doubleClicked(QModelIndex)"), self.tableEdited )
        self.show()

1 个答案:

答案 0 :(得分:2)

我认为你错过了ItemDelegate中的setEditorData()方法。

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

但是,如果您仍想将日期存储为字符串,请参阅下面的示例程序,了解如何使用委托。

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_())