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 :

Gérer le style du projet (en fonction de l'OS)


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut Gérer le style du projet (en fonction de l'OS)
    Bonjour,

    dans une application Qt avec Widgets, est-il réaliste (et efficace) de gérer le style d'un projet en fonction de l'OS détecté notamment la police utilisée par les widgets, sa taille, les couleurs de barre de sélection... par une approche globale et surtout centralisée.

    Plus spécifiquement (et pour que la première question ait un sens) est-il également possible de contrôler par programmation la taille des QLabels par exemple ?

    En supposant que je construise l'UI d'une fenêtre sous Windows avec la police par défaut, le même QLabel de taille "adaptée au plus proche" pour afficher complètement le texte, ne l'affichera pas toujours complètement sous une Mint 17.2 et pourra le présenter de manière tronquée. Il est un peu fastidieux de vérifier l'UI systématiquement sous les 3 environnements et surtout c'est peu efficace. Y a-t-il un moyen de connaître la taille nécessaire à l'affichage d'un texte dans un champ donné ?

    Merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Je précise un peu ma demande.

    J'ai commencé à comparer 3 approches
    1. la fluide. Le principe est celui des pages Web dans la mesure où l'on dispose de Qt Quick. Malheureusement en Desktop, la gestion des éléments me semble nettement plus compliquée à mettre en oeuvre et je ne pense pas que cela ne soit qu'une question d'habitudes.
    2. l'affectation de plusieurs ui à une même classe. Cela semble faisable voire prometteur. A tester.
    3. enfin l'utilisation d'un paramétrage par StyleSheet ou assimilés. Cela semble partiellement fonctionnel notamment au niveau des héritages.


    Je fais appel au forum parce que le test des solutions est chronophage et parce qu"une autre voie est peut-être envisageable.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Après divers essais, il semble bien que la 2ème solution soit la plus simple à mettre en oeuvre. Il faut un peu l'agrémenter de quelques éléments de la solution 3. Je crée un mainwidow.ui d'origine [ici je travaille sous Mint] donc mainwindowlin.ui. Je développe le programme et crée à partir de mainwindowlin.ui, les mainwindowwin.ui et mac dont j'ai besoin que j'intègre dans le projet. Je bascule d'environnement et adapte légèrement les tailles voire l'organisation de l'ui concernée, après cependant avoir défini par code les polices par défaut.

    Mais la question de départ (la taille des QLabels) reste entière si on veut par exemple internationaliser l'application (ce qui n'est pas le cas de celle-là).
    • QtxUI .pro
      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
      QT       += core gui
       
      greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
      TARGET = QtxUI
      TEMPLATE = app
       
      SOURCES += main.cpp\
              mainwindow.cpp
       
      HEADERS  += mainwindow.h
       
      FORMS    += \
          mainwindow/mainwindowwin64.ui \
          mainwindow/mainwindowwin32.ui \
          mainwindow/mainwindowmac.ui \
          mainwindow/mainwindowlin.ui

    • mainwidow.cpp
      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
      33
      34
      #include "mainwindow.h"
      #ifdef _WIN32
              // Define for Windows (32-bit and 64-bit, this part is common)
              #include "ui_mainwindowwin32.h"
         #ifdef _WIN64
              // Define for Windows (64-bit only)
              #include "ui_mainwindowwin64.h"
         #endif
      #elif __APPLE__
          #if TARGET_OS_MAC
              #include "ui_mainwindowmac.h"
          #else
              // Unsupported platform
          #endif
      #elif __linux
              // linux
              #include "ui_mainwindowlin.h"
      #elif __unix // all unices not caught above
              // Unix
      #elif __posix
              // POSIX
      #endif
       
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
      }
       
      MainWindow::~MainWindow()
      {
          delete ui;
      }

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Je réponds à la question d'origine. J'avais déjà traité le problème dans un autre forum quand j'ai fait mes "classes" sous Qt. A l'époque je testais plusieurs autres environnements pour quitter celui que j'utilisais... Cela me disait quelque chose mais je n'étais pas sûr de l'avoir traité en Qt : La solution passe par un QFontMetrics qui permet de déterminer la largeur nécessaire du champ. Une fois celle-ci déterminée, on lui applique si nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QString sTmp = ui->label->text();
    QFontMetrics fMtc(ui->label->font());
    if(ui->label->width() < fMtc.width(sTmp))
       ui->label->resize(fMtc.width(sTmp), ui->label->width());
    Donc résolu.

  5. #5
    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
    Un peu tard, mais l'approche de loin la plus simple est de ne pas s'embêter du tout avec les tailles et laisser Qt gérer ça au travers des layouts : http://doc.qt.io/qt-5/layout.html

    A moins d'avoir des besoins spécifiques sur les dimensions ou de positionner en absolu, il est bien plus simple et portable d'assembler ses widgets avec des layouts+spacers (pour le placement) et QWidget::sizePolicy (pour les dimensions). Contrairement à une dimension absolue, ton QLabel prendra la taille dont il a besoin s'il est placé dans un layout, et tu peux affiner en lui demandant de ne pas prendre plus ou au contraire s'étendre avec la sizePolicy.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Par défaut
    Bonjour, merci pour ta réponse.

    Citation Envoyé par ymoreau Voir le message
    Un peu tard
    Non, il n'est jamais trop tard pour apprendre.

    Citation Envoyé par ymoreau Voir le message
    [...] mais l'approche de loin la plus simple est de ne pas s'embêter du tout.
    Cette philosophie m'intéresse.

    Citation Envoyé par ymoreau Voir le message
    Contrairement à une dimension absolue, ton QLabel prendra la taille dont il a besoin s'il est placé dans un layout, et tu peux affiner en lui demandant de ne pas prendre plus ou au contraire s'étendre avec la sizePolicy.
    Je vais retenter l'approche.

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

Discussions similaires

  1. Comment gérer le style d'un objet créé dynamiquement
    Par Delphi-ne dans le forum ASP.NET
    Réponses: 3
    Dernier message: 05/02/2008, 16h12
  2. Réponses: 75
    Dernier message: 22/08/2007, 09h18
  3. Comment gérer mes liens créés par la fonction MM_Images ?
    Par gamory dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/05/2007, 00h52
  4. [VB.net]Gérer un Application.Exit() dans une fonction
    Par arnolem dans le forum Windows Forms
    Réponses: 1
    Dernier message: 24/05/2006, 14h03
  5. Réponses: 2
    Dernier message: 17/08/2005, 15h08

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