2013-12-20 179 views
1

我有一個抽象項目模型。它顯示爲一棵樹。 其目的是存儲一組偏好。 爲Qt對象的代碼是:PyQt4 QAbstractItemModel浮點數在小數點後兩位

class QPreferenceModel(QAbstractItemModel): 
    'Convention states only items with column index 0 can have children' 
    @report_thread_error 
    def __init__(self, pref_struct, parent=None): 
     super(QPreferenceModel, self).__init__(parent) 
     self.rootPref = pref_struct 

    @report_thread_error 
    def index2Pref(self, index=QModelIndex()): 
     '''Internal helper method''' 
     if index.isValid(): 
      item = index.internalPointer() 
      if item: 
       return item 
     return self.rootPref 

    #----------- 
    # Overloaded ItemModel Read Functions 
    @report_thread_error 
    def rowCount(self, parent=QModelIndex()): 
     parentPref = self.index2Pref(parent) 
     return parentPref.qt_row_count() 

    @report_thread_error 
    def columnCount(self, parent=QModelIndex()): 
     parentPref = self.index2Pref(parent) 
     return parentPref.qt_col_count() 

    @report_thread_error 
    def data(self, index, role=Qt.DisplayRule): 
     '''Returns the data stored under the given role 
     for the item referred to by the index.''' 
     if not index.isValid(): 
      return QVariant() 
     if role != Qt.DisplayRole and role != Qt.EditRole: 
      return QVariant() 
     nodePref = self.index2Pref(index) 
     data = nodePref.qt_get_data(index.column()) 
     var = QVariant(data) 
     print('---') 
     print('data = %r' % data) 
     print('type(data) = %r' % type(data)) 
     #if isinstance(data, float): 
      #var = var.toDouble()[0] 
     print('var= %r' % var) 
     return var 

    @report_thread_error 
    def index(self, row, col, parent=QModelIndex()): 
     '''Returns the index of the item in the model specified 
     by the given row, column and parent index.''' 
     if parent.isValid() and parent.column() != 0: 
      return QModelIndex() 
     parentPref = self.index2Pref(parent) 
     childPref = parentPref.qt_get_child(row) 
     if childPref: 
      return self.createIndex(row, col, childPref) 
     else: 
      return QModelIndex() 

    @report_thread_error 
    def parent(self, index=None): 
     '''Returns the parent of the model item with the given index. 
     If the item has no parent, an invalid QModelIndex is returned.''' 
     if index is None: # Overload with QObject.parent() 
      return QObject.parent(self) 
     if not index.isValid(): 
      return QModelIndex() 
     nodePref = self.index2Pref(index) 
     parentPref = nodePref.qt_get_parent() 
     if parentPref == self.rootPref: 
      return QModelIndex() 
     return self.createIndex(parentPref.qt_parents_index_of_me(), 0, parentPref) 

    #----------- 
    # Overloaded ItemModel Write Functions 
    @report_thread_error 
    def flags(self, index): 
     'Returns the item flags for the given index.' 
     if index.column() == 0: 
      # The First Column is just a label and unchangable 
      return Qt.ItemIsEnabled | Qt.ItemIsSelectable 
     if not index.isValid(): 
      return Qt.ItemFlag(0) 
     childPref = self.index2Pref(index) 
     if childPref: 
      if childPref.qt_is_editable(): 
       return Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable 
     return Qt.ItemFlag(0) 

    @report_thread_error 
    def setData(self, index, data, role=Qt.EditRole): 
     'Sets the role data for the item at index to value.' 
     if role != Qt.EditRole: 
      return False 
     leafPref = self.index2Pref(index) 
     result = leafPref.qt_set_leaf_data(data) 
     if result is True: 
      self.dataChanged.emit(index, index) 
     return result 

    @report_thread_error 
    def headerData(self, section, orientation, role=Qt.DisplayRole): 
     if orientation == Qt.Horizontal and role == Qt.DisplayRole: 
      if section == 0: 
       return QVariant('Config Key') 
      if section == 1: 
       return QVariant('Config Value') 
     return QVariant() 

我認爲問題可能是在使用setData或數據

   def data(self, index, role=Qt.DisplayRule): 
        '''Returns the data stored under the given role 
        for the item referred to by the index.''' 
        if not index.isValid(): 
         return QVariant() 
        if role != Qt.DisplayRole and role != Qt.EditRole: 
         return QVariant() 
        nodePref = self.index2Pref(index) 
        data = nodePref.qt_get_data(index.column()) 
        var = QVariant(data) 
        print('---') 
        print('data = %r' % data) 
        print('type(data) = %r' % type(data)) 
        #if isinstance(data, float): 
         #var = var.toDouble()[0] 
        print('var= %r' % var) 
        return var 

       def setData(self, index, data, role=Qt.EditRole): 
        'Sets the role data for the item at index to value.' 
        if role != Qt.EditRole: 
         return False 
        leafPref = self.index2Pref(index) 
        result = leafPref.qt_set_leaf_data(data) 
        if result is True: 
         self.dataChanged.emit(index, index) 
        return result 

我用數據瞎搞,看是否轉動的QVariant到雙會做一些東西。我也嘗試用Qt.UserRole替換Qt.DisplayRole和Qt.EditRole。

我不確定什麼是控制浮點的顯示和編輯精度。類型是正確的,但是每當我想輸入像.0002 Qt這樣的東西時,就不能輸入.0

+0

你在數據中寫了DisplayRule而不是DisplayRole(role = Qt.DisplayRule) – Kikohs

+0

另外,你用什麼View? – Kikohs

回答

0

您可以使用自定義的item delegate來調整浮動的精度,但對於此特定的用途可能會過度使用 - 案件。

一個更簡單的解決方案是將值作爲字符串返回 - 然後您可以以任何喜歡的方式格式化顯示的值。

相關問題