首页 > 解决方案 > PyQt5 无法使用 InputMask 清除字段

问题描述

我在放置输入掩码的 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 期望该字段为非空白或零。我该如何绕过这个障碍?

标签: pythonpython-3.xpyqt5

解决方案


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


推荐阅读