You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5 QTableWidget如何限制用户仅输入数字?

QTableWidget限制仅输入数字(支持动态新增元素)

不用逐个给单元格设置限制,直接用**自定义委托(QItemDelegate)**就能全局生效,不管是已有单元格还是后续新增的元素,编辑时都会自动限制输入数字。

实现步骤

  1. 自定义数字输入委托
    继承QItemDelegate,重写createEditor方法,返回带数字验证器的QLineEdit。根据需求选择整数验证器(QIntValidator)或小数验证器(QDoubleValidator)。

  2. 给QTableWidget绑定委托
    可以给指定列设置委托(只限制某列输入数字),或者给整个表格设置委托(所有列都限制)。

完整PyQt5代码示例

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget, 
                             QTableWidgetItem, QItemDelegate, QLineEdit)
from PyQt5.QtGui import QIntValidator, QDoubleValidator

class NumberInputDelegate(QItemDelegate):
    def __init__(self, is_integer=True, parent=None):
        super().__init__(parent)
        self.is_integer = is_integer

    def createEditor(self, parent, option, index):
        # 创建带数字验证的输入框
        editor = QLineEdit(parent)
        if self.is_integer:
            # 整数验证器,可自定义范围,示例为0到9999
            validator = QIntValidator(0, 9999, editor)
        else:
            # 小数验证器,自定义范围和精度(保留2位小数)
            validator = QDoubleValidator(0.0, 9999.99, 2, editor)
            validator.setNotation(QDoubleValidator.StandardNotation)
        editor.setValidator(validator)
        return editor

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QTableWidget数字输入限制")
        self.table = QTableWidget(self)
        self.setCentralWidget(self.table)
        
        # 初始化表格:3行2列
        self.table.setRowCount(3)
        self.table.setColumnCount(2)
        self.table.setHorizontalHeaderLabels(["整数列", "小数列"])
        
        # 给列绑定委托
        # 第0列限制整数输入
        int_delegate = NumberInputDelegate(is_integer=True)
        self.table.setItemDelegateForColumn(0, int_delegate)
        # 第1列限制小数输入
        double_delegate = NumberInputDelegate(is_integer=False)
        self.table.setItemDelegateForColumn(1, double_delegate)
        
        # 初始化已有元素
        for row in range(3):
            self.table.setItem(row, 0, QTableWidgetItem("123"))
            self.table.setItem(row, 1, QTableWidgetItem("45.67"))
        
        # 模拟动态新增行(实际场景可绑定按钮触发)
        self.add_new_row()

    def add_new_row(self):
        row_count = self.table.rowCount()
        self.table.insertRow(row_count)
        # 新增行自动继承列的委托限制
        self.table.setItem(row_count, 0, QTableWidgetItem("789"))
        self.table.setItem(row_count, 1, QTableWidgetItem("0.12"))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

关键说明

  • 委托会自动应用到对应列的所有单元格,包括后续动态新增的行,无需逐个设置验证器。
  • 可根据需求调整验证器范围(支持正负数字、自定义小数精度),修改QIntValidator或QDoubleValidator的参数即可。
  • 如果使用C++ Qt,逻辑完全一致:自定义继承QItemDelegate的类,重写createEditor方法返回带QValidator的QLineEdit,再调用setItemDelegateForColumn绑定到表格。

内容的提问来源于stack exchange,提问作者Ismoilmirzo Inoyatov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:45:11