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

Discussion :

Empiler des widgets sur la gauche

  1. #1
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut Empiler des widgets sur la gauche
    Bonjour,

    Voila, j'essaie actuellement de créer un petit programme dans lequel j'ai besoin "d'empiler" des images sur la gauche, je m'explique.

    L'idée est que, quand je rajoute une image à mon widget, celle-ci se mette tout à gauche du widget, et qu'en j'en rajoute une autre, qu'elle se positionne juste à la droite de la 1ere, etc... (les images étant des QLabel contenant un QPixmap)

    Pour le moment, j'essaie de faire ça avec un QHBoxLayout, mais c'est pas trés concluant, j'essaie avec le setAlignement(Qt::AlignLeft), en spécifiant à chaque ajout l'alignement, j'ai mis le spacing du layout à 0, mais rien n'y fait.

    Quelqu'un pourrait-il me dire si c'est faisable ainsi (et donc, si oui, ce que j'oublie/fais mal), ou alors si il faut changer de méthode....

    Merci

  2. #2
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Je dois pas tout bien comprendre, parce que chez moi des QLabel dans un QHBoxLayout avec Qt::AlignLeft et un spacing de 0, et bien ils s'empilent tous à gauche (chacun à la droite du précédent, sans espace entre eux), ce qui me semble plutôt cohérent comme comportement.

    Donc si tu as pas ça, il y a un soucis dans le code, sinon il me faudrait un peu plus d'explication pour visualiser ce que tu recherches.

  3. #3
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Ba moi aussi ça me semble cohérent comme comportement c'est pourquoi je pose la question lol

    Voila le code déjà:
    Ligne.hh
    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
    #ifndef __LIGNE_HH__
    #define __LIGNE_HH__
     
    #define HAUTEUR_LIGNE 61
     
    #include <QWidget>
    #include <QHBoxLayout>
     
    class Ligne : public QWidget
    {
    	Q_OBJECT
     
    public:
    	Ligne(unsigned int l, QWidget* parent =0);
    	virtual ~Ligne();
     
    	bool ajouterLettre(unsigned int num);
    	bool peutAjouterLettre(const QPixmap& p) const;
    	bool peutAjouterLongueur(unsigned int l) const;
     
    	void setEtendue(bool b);
    private:
    	QString text;
    	unsigned int longueur;
    	unsigned int longueurMax;
    	QHBoxLayout* layout;
    };
    ligne.cc
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include "ligne.hh"
     
    #include <QLabel>
    #include <QMessageBox>
     
    Ligne::Ligne(unsigned int l, QWidget* parent): QWidget(parent), text(""), longueur(0), longueurMax(l)
    {
    	setFixedSize(l, HAUTEUR_LIGNE);
    	setAutoFillBackground(true);
    	QPalette pal;
    	pal.setColor(QPalette::Window, QColor(170,200,230));
    	setPalette(pal);
    	layout = new QHBoxLayout();
    	layout->setSpacing(0);
    	setLayout(layout);
    }
     
    Ligne::~Ligne() {
    	// TODO Auto-generated destructor stub
    }
     
    bool Ligne::ajouterLettre(unsigned int num)
    {
    	if(num>39) return false;
    	QPixmap im("lettres/"+QString::number(num)+".png");
    	if(im.isNull()) return false;
    	if(!peutAjouterLettre(im)) return false;
    	if(text.isEmpty()) text = QString::number(num);
    	else text += ","+QString::number(num);
    	QLabel* label = new QLabel();
    	label->setPixmap(im);
    	layout->addWidget(label, 0, Qt::AlignLeft);
    	longueur+=im.size().width();
    	return true;
    }
     
    bool Ligne::peutAjouterLettre(const QPixmap& p) const
    {
    	return p.size().width()+longueur <= longueurMax;
    }
     
    bool Ligne::peutAjouterLongueur(unsigned int l) const
    {
    	return (longueur+l)<=longueurMax;
    }
     
    void Ligne::setEtendue(bool b)
    {
     
    }
    screen.hh
    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
    #ifndef __SCREEN_HH__
    #define __SCREEN_HH__
     
    #include "ligne.hh"
     
    #include <QWidget>
    #include <QList>
    #include <QVBoxLayout>
     
    class Screen : public QWidget
    {
    	Q_OBJECT
    public:
    	Screen(QWidget* parent =0);
    	virtual ~Screen();
    private:
    	QList<Ligne*> lignes;
    	QVBoxLayout* layout;
    public slots:
    	void ajouterLettre(int i);
    	void ajouterLigne();
    };
     
    #endif /* __SCREEN_HH__ */
    screen.cc
    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
    #include "screen.hh"
     
    #include <QPalette>
     
    Screen::Screen(QWidget* parent): QWidget(parent)
    {
    	setFixedSize(800,800);
    	setAutoFillBackground(true);
    	QPalette pal;
    	pal.setColor(QPalette::Window, QColor(153,185,206));
    	setPalette(pal);
    	layout = new QVBoxLayout();
    	ajouterLigne();
    	setLayout(layout);
    }
     
    Screen::~Screen() {
    	// TODO Auto-generated destructor stub
    }
     
    void Screen::ajouterLettre(int i)
    {
    	Ligne* l = lignes.last();
    	l->ajouterLettre(i);
    }
     
    void Screen::ajouterLigne()
    {
    	Ligne* l = new Ligne(width());
    	lignes.append(l);
    	layout->addWidget(l);
    }
    et c'est appelé comme ça pour l'instant:
    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
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
    	setCentralWidget(new QWidget());
    	QHBoxLayout* layout = new QHBoxLayout();
     
    	screen = new Screen();
    	layout->addWidget(screen);
     
    	screen->ajouterLettre(33);
    	screen->ajouterLettre(37);
    	screen->ajouterLettre(35);
    	centralWidget()->setLayout(layout);
    	setWindowTitle("Appli");
    }
    Et moi voila ce que ça me donne:


    Donc si tu vois d'ou ça peut venir^^

  4. #4
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Je crois que tu alignes au mauvais endroit.

    Tu ajoutes ton image avec un alignement gauche dans addWidget() du layout, sauf que d'après la doc ça correspond à l'alignement dans la cellule du layout où tu places ton image.
    The alignment is specified by alignment. The default alignment is 0, which means that the widget fills the entire cell.
    Essayes de faire un layout->setAlignment(Qt::AlignLeft); avec le setSpacing qu'il y a déjà et de faire juste des addWidget(label);

  5. #5
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Ah ba ouai comme ça, ça marche.

    Ba merci beaucoup, encore une erreur résolue lol

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/02/2013, 15h59
  2. Mettre des widgets sur une image
    Par takepatience dans le forum Tkinter
    Réponses: 3
    Dernier message: 25/08/2010, 23h29
  3. [2D/3D] superposer des widgets sur un QGLWidget ?
    Par divide dans le forum Qt
    Réponses: 2
    Dernier message: 10/05/2010, 07h59
  4. [gtkmm] pointer sur des widgets
    Par MDiabolo dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 20/03/2008, 12h44
  5. accrocher des widget sur une table
    Par insa59 dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 02/04/2007, 11h32

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