gpt4 book ai didi

python - 如何在 QSqlTableModel 中格式化具有十进制数字的列

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:18 25 4
gpt4 key购买 nike

我有一个 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:比较中超出了最大递归深度

  • 编辑:
  • 首先我像这样加载模型:

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

    最佳答案

    您不应该访问 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将其识别为整数,解决方案很简单,你必须将其转换为 float :

    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 不是表,而是 View ,并且是只读的,因此您无法编辑它。

    关于python - 如何在 QSqlTableModel 中格式化具有十进制数字的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45343715/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com