2017-08-23 6 views
0

Ich entwickle eine pyform Steuerung, die nur URLs als Eingabe akzeptiert.pyforms - dynamisches Styling basierend auf Variablenwert

Um dies zu erreichen, derivierte ich meine Klasse von ControlText und fügte einen keypress Event-Handler hinzu, der den aktuellen Wert gegen einen regulären Ausdruck testet.

Jetzt möchte ich irgendwie das Aussehen der Steuerelemente basierend auf einer Variablen wie in style.css gezeigt ändern.


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+)[email protected])?(((([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; 
} 

Ich würde es vorziehen, sie mit cs Lösung s aber jede Lösung wird geschätzt.

Antwort

0

dynamische Styling basiert auf QPropertys, die mit setProperty eingestellt werden kann und der CSS-Selektor sieht aus wie [propertyname=propertyvalue]


Code:

import sys 
import pyforms 
from pyforms.Controls import ControlText 
import re 


class ControlUrl(ControlText): 

    def __init__(self, *args, regex="^((https?:)?\/\/)?(\w+(:\w+)[email protected])?(((([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; 
} 

Weitere Informationen:

Verwandte Themen