PyQt5 无法使用 InputMask 清除字段

Posted

技术标签:

【中文标题】PyQt5 无法使用 InputMask 清除字段【英文标题】:PyQt5 Unable to clear a field using InputMask 【发布时间】:2019-01-24 19:28:02 【问题描述】:

我在放置输入掩码的 QTableView 上遇到 QLineEdit 问题。我遇到的问题是,一旦将值放入其中,我就无法清除该字段。删除输入掩码允许我清除该字段。我的代码:

import sys
from PyQt5.Qt import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class PhnDataModel(QStandardItemModel):    
    sig_loaded = pyqtSignal()

    def __init__(self, parent=None):
        super(PhnDataModel, self).__init__(parent)

    def newItem(self, xpos, ypos, display, data=None):
        item = QStandardItem()
        item.setData(display, Qt.DisplayRole)
        if data != None:
            item.setData(data, Qt.UserRole)
        self.setItem(xpos, ypos, item)

    def loadModel(self):
        self.clear()
        for ndx in range(4):
            self.newItem(ndx, 1, ["Office", "Fax", "Mobile", "Other"][ndx], ndx)
            self.newItem(ndx, 0, "")
            self.newItem(ndx, 2, "")
        self.sig_loaded.emit()

class PhnDataDelegate(QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(PhnDataDelegate, self).initStyleOption(option, index)
        if index.column() == 2:
            option.text = index.data()
            option.displayAlignment = Qt.AlignVCenter | Qt.AlignHCenter

    def paint(self, painter, option, index):
        if index.column() == 1:
            option.font.setWeight(QFont.Bold)
            option.palette.setColor(QPalette.Text, QColor(0, 51, 0))
        QStyledItemDelegate.paint(self, painter, option, index)

    def createEditor(self, parent, option, index):
        if index.column() == 2:
            editor = QLineEdit(parent)
            editor.setInputMask("(999) 999-9999")
            return editor
        QStyledItemDelegate.createEditor(self, parent, option, index)


class PhnDataBrowse(QTableView):
    def __init__(self, parent=None):
        super(PhnDataBrowse, self).__init__(parent)
        self.setGeometry(QRect(5, 5, 286, 111))
        self.setDragDropOverwriteMode(False)
        self.setAlternatingRowColors(True)
        self.setSelectionMode(QAbstractItemView.SingleSelection)
        self.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.setCornerButtonEnabled(False)
        self.horizontalHeader().setVisible(False)
        self.verticalHeader().setVisible(False)
        self.horizontalHeader().setStretchLastSection(True)
        self.model = PhnDataModel()
        self.model.sig_loaded.connect(self.__loaded)
        self.setItemDelegate(PhnDataDelegate())

    def __loaded(self):
        self.setModel(self.model)
        self.setColumnHidden(0, True)
        self.resizeRowsToContents()
        self.selectRow(0)


class testWindow(QDialog):
    def __init__(self, parent=None):
        super(testWindow, self).__init__(parent)
        self.layout = QVBoxLayout(self)
        self.phndata = PhnDataBrowse()
        self.layout.addWidget(self.phndata)
        self.save_btn = QPushButton()
        self.save_btn.setText("Save")
        self.layout.addWidget(self.save_btn)            
        self.phndata.model.loadModel()



if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    win = testWindow()
    win.show()
    sys.exit(app.exec_())

看起来 inputMask 期望该字段为非空白或零。我该如何绕过这个障碍?

【问题讨论】:

你产生了几个错误,你能测试一下你的minimal reproducible example吗? 你也可以更好地解释你的问题,使用 InputMask 清除字段是什么意思? 是的,代码已修复 - 复制了错误的面板。运行代码,双击输入电话号码。根据掩码输入电话号码后,重新编辑电话号码并尝试将其删除。 好的,你想删除电话号码,所以我知道如何开始 没错 【参考方案1】:

看起来我遇到的问题是使用 (999) 999-9999 而不是 (000) 000-0000。问题已解决。

【讨论】:

以上是关于PyQt5 无法使用 InputMask 清除字段的主要内容,如果未能解决你的问题,请参考以下文章

jQuery inputmask 对字符数没有限制

如何使用 jquery inputmask 插件设置文本字段长度的范围

为啥 Inputmask 不能正确处理日期?

当屏蔽字段具有“只读”属性时,jQuery Inputmask 插件会阻止表单提交

JQuery Inputmask 不显示分隔符

无法从 PyQT5 文本字段中获取文本