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 插件设置文本字段长度的范围