您的位置:首页 > 编程语言 > Qt开发

在QTableView里调整显示效果的方法

2017-11-19 11:54 676 查看
如果打算使用QTableView和QSqlTableModel组合读取数据库,并在视图层面显示带千位分隔符数字和调整对齐的话

需要重写的是QSqlTableModel的data方法

from PyQt5.QtCore import Qt, QVariant
from PyQt5.QtSql import QSqlTableModel

class ExampleTableModel(QSqlTableModel):
def __init__(self, *args):
super(ExampleTableModel, self).__init__(*args)

def data(self, index, role=None):
value = super(ExampleTableModel, self).data(index, role)
if index.model().headerData(index.column(), 1) == "Amount" and role == Qt.TextAlignmentRole:
return QVariant(int(Qt.AlignRight | Qt.AlignVCenter))
elif index.model().headerData(index.column(), 1) == "Amount" and role == Qt.DisplayRole:
try:
return f"{value:,.2f}"
except:
return value
else:
return value


如果打算在QTableView编辑数字的时候限制输入为可选千位分隔符的正负数字或空字符,并需要调整对齐的话,需要写一个QDelegate代理和新的输入框类并挂到QTableView上

from PyQt5.QtWidget import QLineEdit, QTableView, QStyledItemDelegate
from PyQt5.QtGui import QRegExpValidator
from PyQt5.QtCore import Qt, QRegExp

class QAmountEdit(QLineEdit):
"""用于金额和增减值率"""
def __init__(self, *args):
super(QAmountEdit, self).__init__(*args)
regex = QRegExp('^[+-]?(\d{1,3}(,\d{3})*|\d+)?(\.\d{0,2})?$')
self.setValidator(QRegExpValidator(regex))
self.setAlignment(Qt.AlignRight | Qt.AlignVCenter)

class ExampleDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
if index.model().headerData(index.column(), 1) == "Amount":
editor = QAmountEdit(parent)
else:
editor = QLineEdit(parent)
return editor

def setEditorData(self, editor, index):
data = index.model().data(index, Qt.EditRole)
if isinstance(editor, QAmountEdit):
try:
editor.setText(f'{float(data):,.2f}')
except:
editor.setText(data)
else:
editor.setText(str(data))

def setModelData(self, editor, model, index):
if isinstance(editor, QAmountEdit):
value = float(editor.text().replace(",", ""))
model.setData(index, value)
else:
model.setData(index, editor.text())

class ExampleTableView(QTableView):
def __init__(self, *args):
super(ExampleTableView, self).__init__(*args)
self.setItemDelegate(ExampleDelegate())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pyqt5 python3
相关文章推荐