Arhn - архитектура программирования

PyQt: определение функции QValidator

В настоящее время я использую довольно жестокий подход, чтобы получить то, что QValidator легко доставил бы. Найти простую информацию об этом виджете довольно сложно. Код ниже скопирован/вставлен (после небольшого редактирования) из другого поста. Он создает диалог с одной строкойEdit, подключенный к ValidStringLength QValidator, который обеспечивает размер строки 0 ‹ длина ‹ 5. Я хотел бы понять, где должна быть размещена «исполняемая» функция очистки строки: внутри метода fixup()? Пожалуйста, объясните логику QValidator().


   from PyQt4 import QtCore, QtGui
    class ValidStringLength(QtGui.QValidator):
        def __init__(self, min, max, parent):
            QtGui.QValidator.__init__(self, parent)

            self.min = min
            self.max = max

        def validate(self, s, pos):
            print 'validate(): ', type(s), type(pos), s, pos

            if self.max > -1 and len(s) > self.max:
                return (QtGui.QValidator.Invalid, pos)

            if self.min > -1 and len(s) < self.min:
                return (QtGui.QValidator.Intermediate, pos)

            return (QtGui.QValidator.Acceptable, pos)

        def fixup(self, s):
            pass


    class Window(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)

            self.editLine = QtGui.QLineEdit(self)
            self.validator = ValidStringLength(0,5,self)

            self.editLine.setValidator(self.validator)

            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.editLine)

    if __name__ == '__main__':

        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.setGeometry(500, 300, 500, 100)
        window.show()
        sys.exit(app.exec_())
16.04.2014

Ответы:


1

Из документов Qt:

fixup() предназначен для валидаторов, которые могут исправлять некоторые пользовательские ошибки. Реализация по умолчанию ничего не делает. QLineEdit, например, вызовет fixup(), если пользователь нажмет Enter (или Return), а содержимое в данный момент недействительно. Это дает функции fixup() возможность творить магию, чтобы сделать недействительную строку приемлемой.

http://qt-project.org/doc/qt-4.8/qvalidator.html

Так что да, если ваша «очистка строк» ​​является попыткой исправить ввод пользователя, fixup должно быть правильным местом для этого.

РЕДАКТИРОВАТЬ:

Первые четыре символа должны быть заглавными:

def validate(self, s, pos):
    print 'validate(): ', type(s), type(pos), s, pos

    n = min(4,s.count())
    if s.left(n).compare(s.left(n).toUpper()):
        return (QtGui.QValidator.Intermediate, pos)
    else:
        return (QtGui.QValidator.Acceptable, pos)

def fixup(self, s):
    n = min(4, s.count())
    s.replace(0, n, s.left(n).toUpper())
16.04.2014
  • Откуда должен вызываться метод fixup()? А как вернуть обновленную (очищенную) строку и с ней обновить lineEdit? Пожалуйста, опубликуйте пример.. допустим, мы хотим использовать первые четыре символа... 16.04.2014
  • Вам не нужно вызывать его самостоятельно, если вы используете lineEdit. Если статус валидатора не Acceptable, lineEdit вызовет fixup, и вы сможете изменить строку на месте (QStrings изменяемы, в отличие от строк Python). Если измененная строка действительна, lineEdit изменит отображаемый текст. Я добавил проверенный пример. 17.04.2014
  • FWIW: возможно, вы захотите изучить использование API 2 для QString, который автоматически преобразует все QString в строки Python. Следовательно, вам не нужно было бы использовать совсем не питонические функции манипулирования строками С++. В этом случае fixup и validate должны будут вернуть измененную строку. 17.04.2014
  • Отличная работа, Себастьян! Спасибо за информацию! 17.04.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..