首页 > 解决方案 > 如何在 QTablewidget 列的列上应用验证器?

问题描述

我在 Qt 设计器中创建了一个表。在表的第 2 列中,我希望用户输入只能是大写字母。如何做同样的事情? 示例表

在这里我无法理解可以在这里使用 QTableWidget 或 QTableWidgetItem 的哪个实用程序?

标签: pythonpython-3.xpyqtpyqt5qtablewidget

解决方案


您可以使用委托来修改用户输入:

from PyQt5 import QtCore, QtGui, QtWidgets


class UpperDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, index, option):
        editor = super(UpperDelegate, self).createEditor(parent, index, option)
        font = QtGui.QFont(editor.font())
        font.setCapitalization(QtGui.QFont.AllUppercase)
        editor.setFont(font)
        return editor

    """def initStyleOption(self, option, index):
        super(UpperDelegate, self).initStyleOption(option, index)
        font = QtGui.QFont(option.font)
        font.setCapitalization(QtGui.QFont.AllUppercase)
        option.font = font"""

    def setModelData(self, editor, model, index):
        text = editor.property("text")
        if isinstance(text, str): 
            editor.setProperty("text", text.upper())
        super(UpperDelegate, self).setModelData(editor, model, index)
        # model.setData(index, editor.text().upper(), QtCore.Qt.DisplayRole)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QTableWidget(10, 4)
    delegate = UpperDelegate(w)
    w.setItemDelegateForColumn(1, delegate)
    w.show()
    sys.exit(app.exec_())

推荐阅读