2014-03-13 9 views
0

QDateTimeEdit을 QTableview의 델리게이트로 사용하여 시작일과 종료일을 표시합니다. 데이터베이스에서받은 데이터를 채울 때 QDateTimeEdit 대리자가 표시하지 않습니다.qdlegate로 사용되는 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

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

내가 그것을 알아 냈 단지의 경우에, 여기 언급 누군가가 동일한 문제로 실행됩니다. 내가 뭘해야만 datetime 개체를 문자열 (db에서 얻는) 변경하는 것입니다. –

+0

답장을 보내 주셔서 감사합니다. "SetEditorData"구현 시도하지만 DB에서받은 데이터를 datetime 객체가 아닌 문자열입니다. 이제 "SetEditorData"를 여기에 구현하지 않으면 문제가 발생합니까? 아니면 괜찮을까요? –