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

来源:互联网 发布:java工程师具备的条件 编辑:程序博客网 时间:2024/05/16 06:45

如果打算使用QTableView和QSqlTableModel组合读取数据库,并在视图层面显示带千位分隔符数字和调整对齐的话
需要重写的是QSqlTableModel的data方法

from PyQt5.QtCore import Qt, QVariantfrom PyQt5.QtSql import QSqlTableModelclass 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, QStyledItemDelegatefrom PyQt5.QtGui import QRegExpValidatorfrom PyQt5.QtCore import Qt, QRegExpclass 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())
阅读全文
0 0
原创粉丝点击