pyforms - динамическое моделирование на основе значения переменной
Я разрабатываю элемент управления Pyform, который принимает только URL-адреса в качестве входных данных.
Чтобы добиться этого, я вывел свой класс из ControlText
и добавил обработчик события нажатия клавиши, который проверяет текущее значение с помощью регулярного выражения.
Теперь я хочу как-то изменить внешний вид элементов управления на основе переменной, как показано в style.css
,
Controls.py
import pyforms
from pyforms.Controls import ControlText
import re
class ControlUrl(ControlText):
def __init__(self, label="", default=None, helptext=None, regex="^((https?:)?\/\/)?(\w+(:\w+)?@)?(((([a-zA-Z\d]{1,2}|[a-zA-Z\d][\w\-]{0,62}[a-zA-Z\d])\.){1,}[\w\-]{2,6})|(\d{1,3}(\.\d{1,3}){3})|([\d:]{2,39}))(:\d{2,6})?(\/[\w.~!+,*:@%-]+)*\/?(\?([\w.~!+%,*:@-]+(=[\w.~!+%,*:@-]+)?)(&[\w.~!+%,*:@-]+(=[\w.~!+%,*:@-]+)?)*)?(#[\w.~!+%,*:@-])?$"):
self._regex = regex
super(ControlUrl, self).__init__(label, default, helptext)
def init_form(self):
self._pattern = re.compile(self._regex)
self.key_pressed_event = self.__key_pressed
super(ControlUrl, self).init_form()
def __key_pressed(self, event):
is_url = self._pattern.search(self.value) != None
self.valid = is_url
style.css
#_urlinput[valid="true"] {
background-color: red;
}
Я бы предпочел решить это с помощью CSS, но каждое решение ценится.
1 ответ
Решение
Динамическое моделирование основано на QPropertys
который может быть установлен с setProperty
и селектор CSS выглядит [propertyname=propertyvalue]
Код:
import sys
import pyforms
from pyforms.Controls import ControlText
import re
class ControlUrl(ControlText):
def __init__(self, *args, regex="^((https?:)?\/\/)?(\w+(:\w+)?@)?(((([a-zA-Z\d]{1,2}|[a-zA-Z\d][\w\-]{0,62}[a-zA-Z\d])\.){1,}[\w\-]{2,6})|(\d{1,3}(\.\d{1,3}){3})|([\d:]{2,39}))(:\d{2,6})?(\/[\w.~!+,*:@%-]+)*\/?(\?([\w.~!+%,*:@-]+(=[\w.~!+%,*:@-]+)?)(&[\w.~!+%,*:@-]+(=[\w.~!+%,*:@-]+)?)*)?(#[\w.~!+%,*:@-])?$", **kwargs):
self._regex = regex
super(ControlUrl, self).__init__(*args, **kwargs)
def init_form(self):
self._pattern = re.compile(self._regex)
self.key_pressed_event = self.__key_pressed
super(ControlUrl, self).init_form()
def __key_pressed(self, event):
self._valid = self._pattern.search(self.value) != None
base = self.form.lineEdit
base.setProperty("valid", self._valid)
#without these lines the style is not applied
base.style().unpolish(base)
base.style().polish(base)
Css:
QLineEdit[valid=false] {
border: 1px solid #991903;
border-radius: 4px;
}
QLineEdit[valid=false]:focus {
border-color: #db391c;
}
Дополнительная информация: