PySide:如何同时拥有输入掩码和占位符文本

问题描述 投票:0回答:2

我正在尝试使 lineEdit 小部件在未聚焦时具有占位符文本(看起来像“MM/DD/YYYY”)并具有输入掩码(看起来像“/ /”,或者您可以通过其他方式输入斜杠) 对焦时。

目前输入掩码

setInputMask('99/99/9999')
优先,我无法找到在 LineEdit 小部件上放置 hasFocus (或类似)信号的方法。

您将如何在一个小部件中实现这两种功能? 保留占位符文本不变并创建一个在输入一定数量的字符后添加斜杠的方法会更容易吗?

此外,当您设置蒙版时,闪烁的光标非常粗。这是怎么回事?如何恢复?

完整代码:

from PySide import QtCore, QtGui

class Ui_MainWindow(object):
    def myChanges(self):
        self.lineEdit.installEventFilter(self.lineEdit.setInputMask('99/99/9999'))
        self.lineEdit.setPlaceholderText('MM/DD/YYYY')

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(557, 351)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtGui.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(100, 130, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(320, 130, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 557, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.myChanges()

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
python pyqt pyside qlineedit
2个回答
2
投票

如果您想要一个小部件的自定义行为,您必须创建一个继承于此的类,对于 QLineEdit 来说。要实现您的特定目标,您必须使用 focusInEvent 和 focusOutEvent 方法,如下节所述:

class LineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        QtGui.QLineEdit.__init__(self, parent=parent)
        self.setPlaceholderText('MM/DD/YYYY')

    def focusInEvent(self, event):
        self.setInputMask('99/99/9999')

    def focusOutEvent(self, event):
        self.setInputMask('')

然后你应该更改为:

self.lineEdit = QtGui.QLineEdit(self.centralwidget)

至:

self.lineEdit = LineEdit(self.centralwidget)

0
投票

新手,我正在寻找这个。 eyllanesc 指出了正确的方向,但有些事情可能已经改变。严格来说,

QtGui.QLineEdit
并不是一件事情,或者它只是 QtCreator ui 输出中发生的奇怪事情之一。

QLineEdit
有方法
setFocus
setFocusPolicy
setFocusProxy
,但不幸的是没有方法可以帮助我们。子类化是最简单的答案(据我所知)。这是一个“一般”答案,而不是修补 ui 文件:

from PyQt5 import QtWidgets as qtw

class NewLineEdit(qtw.QLineEdit):
    def __init__(self, parent):
        super().__init__(parent)

    def focusInEvent(self, event):
        self.setInputMask("99/99/9999")

    def focusOutEvent(self, event):
        self.setInputMask("")

然后,在你的

MainWindow
或其他什么中:

dateField = NewLineEdit(self)
dateField.setPlaceholderText("MM/DD/YYYY")

可以对其进行改进,而无需在定制小部件中对蒙版进行硬编码。

class NewLineEdit(qtw.QLineEdit):
    def __init__(self, parent, mymask, *args, **kwargs):
        self.mymask = mymask
        super().__init__(parent, *args, **kwargs)

    def focusInEvent(self, event):
        self.setInputMask(self.mymask)

    def focusOutEvent(self, event):
        self.setInputMask("")

然后

dateField = NewLineEdit(self, "99/99/9999")
dateField.setPlaceholderText("MM/DD/YYYY")

PyQt 5.15.9
Qt 5.15.10
Python 3.10.13

© www.soinside.com 2019 - 2024. All rights reserved.