IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Rafraichir le CSS


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut Rafraichir le CSS
    Bonjour,
    J'utilise le CSS et les propriétés "méta-objet" pour modifier l'apparence de widget en fonction d'une "classe css", en fait un simple attribut string qui nomme (ou pas) une certaine classe.
    Comme le suggère la doc http://qt.developpez.com/doc/4.7/exe...tes-dynamiques

    Le problème est qu'il faut définir ces propriétés sur les objets avant de charger le CSS sinon l'affichage ne les prends pas en compte. Je cherche donc la meilleure méthode pour "rafraichir" l'affichage du CSS. Pour le moment je recharge carrément le fichier avec "qApp->setStyleSheet".

    Y'a-t-il une méthode propre ou plus rapide à l'exécution ? merci d'avance !

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par YoniBlond Voir le message
    Le problème est qu'il faut définir ces propriétés sur les objets avant de charger le CSS sinon l'affichage ne les prends pas en compte.
    C'est pas dynamique?? ça m'étonne.

    Ça tombe bien, je vais utiliser ceci tout à l'heure. Je te dirais si j'obtient le même problème.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    A priori, il faut effectivement forcer la mise à jour du control avec setStyleSheet (update, refresh, etc. ne fonctionnent pas)

    Par contre, tu peux simplement forcer le controle qui doit être mit à jour (et les controles "enfants") avec setStyleSheet(b->styleSheet());

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    private:
        QPushButton* b;
     
    public:
        MainWindow(QWidget *parent = 0)
            : QMainWindow(parent)
        {
            b = new QPushButton("cliquer ici", this);
            b->setProperty("prop", QVariant(false));
            b->setStyleSheet("* [prop='true'] { background-color: yellow }");
            connect(b, SIGNAL(clicked()), this, SLOT(clique()));
        }
     
    public slots:
        void clique()
        {
            if(b->property("prop").toBool() == true)
            {
                b->setProperty("prop", QVariant(false));
                setStyleSheet(b->styleSheet());
            }
            else
            {
                b->setProperty("prop", QVariant(true));
                setStyleSheet(b->styleSheet());
            }
        }
    };
    Le mieux est encore de forcer la mise à jour des controles dans les fonctions d'accès des propriétés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MyWidget : public QWidget
    {
        Q_OBJECT
        Q_PROPERTY(bool myproperty READ getMyProperty WRITE setMyProperty)
     
    public:
        bool getMyProperty() { return property("myproperty").toBool(); }
        void setMyProperty(bool value)
        {
            setProperty("myproperty", QVariant(value));
            setStyleSheet(b->styleSheet());
        }
    };

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Par contre, tu peux simplement forcer le controle qui doit être mit à jour (et les controles "enfants") avec setStyleSheet(b->styleSheet());
    SI tu fait cela, tu va recopier le stylesheet, et il ne sera plus partagé. Ce qui veut dire que si tu modifie le stylesheet avec QApplication, cela n'affectera pas ces widgets...

    Sans compté qu'il devra reparser tous le qss ce qui peut couter en temps.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    SI tu fait cela, tu va recopier le stylesheet, et il ne sera plus partagé. Ce qui veut dire que si tu modifie le stylesheet avec QApplication, cela n'affectera pas ces widgets...
    Que veux-tu dire par "partagé" ?

    En fait, setStyleSheet(b->styleSheet()); force la mise à jour du controle et des enfants et prend en compte les styles hérités

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    qApp->setStyleSheet("* [prop='true'] { background-color: yellow }");
    ...
    b->setProperty("prop", QVariant(true));
    b->setStyleSheet(b->styleSheet());
    fonctionne correctement.

    Par contre, cela "oblige" à recopier une chaine de caractère (si elle est définie dans le controle mais pas si les stylesheet sont définies dans qApp), mais ce n'est pas important (en terme de temps) comparé à la mise à jour du controle.

    Mais c'est quand même plus "propre" (visuellement) avec polish().

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Que veux-tu dire par "partagé" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setStyleSheet(b->styleSheet())
    créé un style spécifique pour la widget. Ce ne sera plus celui de QApplication.

    Donc si tu modifie le styleSheet globale, la widget ne sera pas modifié.


    Mais c'est quand même plus "propre" (visuellement) avec polish().
    je ne suis pas d'accord.
    1- polish == Le style réadapte l'affichage d'un widget.
    2- redonner un style sheet == appliquer un nouveau style. Sans compter qu' il va devoir tous reparser pour initialiser le nouveau style...

  7. #7
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    La première méthode de yan fonctionne aussi bien que ce que je faisais avant, et est sûrement plus efficace car je lisais/rechargeais tout le fichier qss à chaque fois. Ça ne prend que 2 lignes donc ça reste acceptable.

  8. #8
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Donc si tu modifie le styleSheet globale, la widget ne sera pas modifié.
    Non. C'est ce que je précisais avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    qApp->setStyleSheet("* [prop='true'] { background-color: yellow }");
    ...
    b->setProperty("prop", QVariant(true));
    b->setStyleSheet(b->styleSheet());
    le style peut être défini au niveau global sans problème. Dans ce cas, b->setStyleSheet(b->styleSheet()); repcopie simplement une chaine de caractères vide puis met à jour le control (en vérifiant les stylesheet des parents, dont qApp)

    Le résultat est identique avec les 2 méthodes

    EDIT: en fait setStyleSheet recopie la style (donc ici b->setStyleSheet(b->styleSheet()); ne fais rien de particulier) puis appelle polish() (http://qt.gitorious.org/qt/qt/blobs/...el/qwidget.cpp). Donc c'est bien la même chose au final.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bon y as rien de documenté... APrés mes teste et recherche sur le net, on peut demander au style de repolishé (je sais pas comment le traduire) une widget.
    J'ai trouvé sur le net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myWidget->style()->unpolish(myWidget);
    myWidget->ensurePolished();
    Sous Qt 4.6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myWidget->style()->polish(myWidget);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myWidget->style()->unpolish(myWidget);
    fonctionne très bien pour moi.


    Bizzare qu'il n'ai pas prévue une fonction pour cela dans QWidget
    En lisant la doc, j'arrive pas à savoir si c'est correcte ou dangereux.... A la limite la version avec unpolish semble plus correspondre.

    [lancement de rumeur]
    Tant pis on la rajoutera dans la ... BIPPPPPPPPPP... Ha oui j'ai pas encore le droit d'en parler encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] possible de rafraichir du CSS dans la page via Ajax?
    Par freeriders88 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2007, 10h39
  2. Mail et css
    Par Truc dans le forum Modules
    Réponses: 2
    Dernier message: 01/10/2003, 22h25
  3. .css
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 25/04/2003, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo