如何在QSqlTableModel中格式化带有十进制数的列

时间:2017-07-27 07:10:54

标签: python pyqt pyqt5 qtableview qsqltablemodel

我在一列中有一个带十进制数的QSqlTableModel。如何将此列格式化为包含4位小数的数字(例如:2,3 - > 2,3000; 4,567891 - > 4,5679)。我正在使用pyqt5。

编辑:

我试图像这样继承QSqlTableModel:

class AlignmentTable(QSqlTableModel):
    def data(self, index, role=Qt.DisplayRole):
       if role == Qt.DisplayRole and index.column() == 4:
          value = '{:01.4f}'.format(self.data(index))
          return value

但我得到错误:RecursionError:比较超过了最大递归深度

  1. 编辑:
  2. 首先我加载这样的模型:

    def load_sitesizes(self):
    
        self.mod_site_sizes = AlignmentTable(parent=None, db=dbtools.ProjectDB.use_project_db(self))
        self.mod_site_sizes.setTable("vSiteSizes")
    
        site_id = str(self.item_id)
        self.mod_site_sizes.setFilter("SiteKey='"+site_id+"'")
    
        self.mod_site_sizes.select()
    
        self.mod_site_sizes.setEditStrategy(QSqlTableModel.OnFieldChange)
    
        self.tblSiteSizes.setModel(self.mod_site_sizes)
    

    而不是你子类中的代码:

    class AlignmentTable(QSqlTableModel):
    
    def data(self, item, role):
    
        if role == Qt.DisplayRole:
            if item.column() == 4:
                val = QSqlTableModel.data(self, item, Qt.DisplayRole)
                if not isinstance(val, float):
                    val = float(val)
                return '{:.4f}'.format(round(val, 4))
    

1 个答案:

答案 0 :(得分:1)

您不应该访问self.data(item)函数,因为您正在调用相同的函数,您必须通过父级访问:QSqlTableModel.data(self, item, Qt.DisplayRole)

周期:

def data(self, item, role):
    if role == Qt.DisplayRole:
        if item.column() == 4:
            val = QSqlTableModel.data(self, item, Qt.DisplayRole)
            if not isinstance(val, float):
                val = float(val)
            return '{:.4f}'.format(round(val, 4))

逗号:

def data(self, item, role):
    if role == Qt.DisplayRole:
        if item.column() == 4:
            number = round(float(QSqlTableModel.data(self, item, Qt.DisplayRole).replace(",", ".")),4)
            return ('{:.4f}'.format(number)).replace(".", ",")
    return QSqlTableModel.data(self, item, role)

根据我在您的数据库中观察到的,第4列的字段是十进制类型,问题是pyqt将其识别为整数,解决方案很简单,您必须将其转换为浮动:

class CustomSqlModel(QSqlTableModel):
    def __init__(self, parent=None):
        QSqlTableModel.__init__(self, parent=parent)
        self.setTable("SiteSizes")
        self.setEditStrategy(QSqlTableModel.OnFieldChange)
        self.select()

    def data(self, item, role):
        val = QSqlTableModel.data(self, item, role)
        if role == Qt.DisplayRole:
            if item.column() == 4:
                try:
                    return '{:.4f}'.format(round(float(val), 4))
                except ValueError:
                    pass
        if role == Qt.EditRole:
            if item.column() == 4:
                try:
                    return float(val)
                except ValueError:
                    pass
        return val

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName("zzProjekt1.db")

    model = CustomSqlModel()

    view = QTableView()
    view.resizeColumnsToContents()
    view.setModel(model)
    view.setWindowTitle("Custom Model")

    view.show()

    sys.exit(app.exec_())

另外一件事是,编辑默认编号时可以编辑2位小数,要将其更改为4位小数,可以使用以下类:

class NumberFormatDelegate(QItemDelegate):
    def __init__(self, parent=None):
        QItemDelegate.__init__(self, parent)

    def createEditor(self, parent, option, index):
        editor = QDoubleSpinBox(parent)
        editor.setMaximum(10**10)
        editor.setDecimals(4)
        return editor
[...]
view.setItemDelegateForColumn(4, NumberFormatDelegate())

注意:我在数据库中注意到的另一件事是vSiteSizes不是Table,它是一个View,它是只读的,所以你不能编辑它。