基于变量值的pyforms动态造型

2024-05-19 00:01:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个只接受url作为输入的pyform控件。在

为了实现这一点,我从ControlText派生了我的类,并添加了一个keypress事件处理程序,它根据正则表达式测试当前值。在

现在我想根据style.css中所示的变量改变控件的外观。在


控件.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

样式表

^{pr2}$

我宁愿用css解决它,但每一个解决方案都值得赞赏。在


Tags: keyimportselfnoneurlinitdefcss
1条回答
网友
1楼 · 发布于 2024-05-19 00:01:22

动态样式基于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:

^{pr2}$

更多信息:

相关问题 更多 >

    热门问题