Как изменить режим курсора по умолчанию со вставки на перезапись при входе в QLineEdit - PullRequest
0 голосов
/ 05 августа 2020

Как следует из названия, моя цель - изменить режим курсора по умолчанию (вставить символ) в режим перезаписи.

У меня есть валидатор, прикрепленный к объекту QLineEdit

expression = QtCore.QRegExp(r'(^[A-Z0-9_]{4})-([A-Z0-9_]{6})-([A-Z0-9_]{6})-([A-Z0-9_]{4})-([A-Z0-9_]{2})-([A-Z0-9_]{6})')
object = QtGui.QRegExpValidator(expression, self)

и значение по умолчанию Компонент QLineEdit:

object.setText('____-______-______-____-__-______')

При вводе QLineObject и для записи чего-либо мне нужно выбрать подчеркивание, изменить его на нужный символ, выбрать другой и так далее. В качестве альтернативы я могу выделить всю строку, удалить ее, а затем написать всю строку. Дело, однако, в том, что иногда мне приходится менять какую-то строку в другом месте и оставлять неизменными подчеркивания. Выбор и изменение персонажа за персонажем работоспособно, но утомительно. Изменение режима курсора со вставки на перезапись, когда фокус курсора находится на одном объекте, было бы гораздо более чистым решением.

Ответы [ 3 ]

2 голосов
/ 05 августа 2020

QLineEdit не имеет режима перезаписи. Но QTextEdit и QPlainTextEdit имеют overwriteMode и setOverwriteMode (bool). Если вы можете использовать QTextEdit, вы можете создать его подкласс и иметь свой собственный keyReleaseEvent. Вот быстрый пример для проверки режима перезаписи. Каждый раз, когда пользователь нажимает клавишу Insert на клавиатуре, переключается режим overwriteMode.

from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit)
from PyQt5 import QtCore
import sys

class OverwriteTextBox(QTextEdit):
    def __init__(self, parent=None):
        super(OverwriteTextBox, self).__init__(parent=parent)
        
    def keyReleaseEvent(self, event):
        key = event.key()
        
        if (key == QtCore.Qt.Key_Insert):
            print('insert')
            self.setOverwriteMode(not self.overwriteMode())
        else:
            # release keyrelease for normal behaviors
            super().keyReleaseEvent(event)

class Example(QMainWindow):
    def __init__(self, parent=None):
     
        super(Example, self).__init__(parent=parent)

        self.setGeometry(300, 200, 570, 450)
        self.setWindowTitle("Overwrite test")            
        self.textbox = OverwriteTextBox(parent=self)
        self.textbox.setGeometry(50, 50, 200, 50)

app = QApplication(sys.argv)
example = Example()         
example.show()
sys.exit(app.exec_() )
1 голос
/ 05 августа 2020

Похоже, вам нужно установить свойство inputMask().

В вашем случае это должно быть:

    object.setInputMask(
        '>NNNN-NNNNNN-NNNNNN-NNNN-NN-NNNNNN;_'

Символ маски N для буквенно-цифровых символов c, если перед ним стоит >, это означает, что все следующие буквы будут в верхнем регистре. Любой набор символов после точки с запятой используется в качестве заполнителя.

0 голосов
/ 05 августа 2020

Просто для справки. Решение, предложенное musicamante, похоже, работает очень хорошо. Есть только одна модификация. При условии, что выражение регулярного выражения, используемое QRegExpValidator, имеет следующий вид:

expression = QtCore.QRegExp(r'(^[A-Z0-9_]{4})-([A-Z0-9_]{6})-([A-Z0-9_]{6})-([A-Z0-9_]{4})-([A-Z0-9_]{2})-([A-Z0-9_]{6})')

Маска ввода должна использовать пробел в качестве символа, используемого для пустых символов

object.setInputMask('>XXXX-XXXXXX-XXXXXX-XXXX-XX-XXXXXX; ')

С подчеркиванием в качестве одного из символов в регулярном выражении строка и замена пустых пустых мест в InputMask У меня были такие странные результаты, как это

enter image description here

instead of expected

введите описание изображения здесь

В любом случае еще раз спасибо за быструю помощь.

...