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

2024-06-16 11:11:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

^{pr2}$

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

Tags: selfnoneindexsignalmodelinitdefconnect
1条回答
网友
1楼 · 发布于 2024-06-16 11:11:07

我认为您在ItemDelegate中缺少了setEditorData()方法。在

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

但是,如果仍然希望将日期存储为字符串,请参阅下面的示例程序,了解如何使用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_())

相关问题 更多 >