我有一个 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 ,并且是只读的,因此您无法编辑它。
我是一名优秀的程序员,十分优秀!