2017-05-14 5 views
2

J'essaie de faire en sorte que les widgets se chevauchent partiellement dans une mise en page Qt. Ma configuration actuelle est le suivant, réalisé avec un QVBoxLayout contenant quatre QHBoxLayout enfants:Faire se chevaucher partiellement les widgets dans une mise en page Qt

My current layout, achieved with a QVBoxLayout containing four QHBoxLayout children

Je suis en train de regrouper les cartes de la même couleur, afin d'obtenir quelque chose comme ceci (notez qu'il ya horizontal et chevauchement) vertical:

This is the kind of overlapping I'm trying to achieve

Malheureusement, toute la documentation Qt et tous les messages Stack Overflow j'ai lu essayer de av oid widgets se chevauchent plutôt que de le chercher. Peut-être existe-t-il un moyen de définir un espacement négatif entre les widgets, ou de forcer une disposition à avoir une largeur maximale calculée (par exemple en fonction du nombre de cartes d'une combinaison dans ce cas)? Ou dois-je créer une mise en page personnalisée? Peut-être que je ne devrais pas utiliser de mise en page du tout?

Si c'est une aide, je suis d'ajouter les widgets à la mise en page avec le code qui ressemble à ceci:

hLayout[card.getSuit()-1]->addWidget(cardWidget, 0, align); 

Répondre

3

Vous aurez besoin de mettre en œuvre une sous-classe de QLayout. Il y a un exemple détaillé dans la documentation QT vous répondre exactement problème: Layout Management

Fondamentalement, vous devez définir les éléments suivants:

  • Une structure de données pour stocker les produits traités par la mise en page. Chaque élément est un QLayoutItem.

  • addItem(), comment ajouter des éléments à la mise en page.

  • setGeometry(), comment effectuer la mise en page.

  • sizeHint(), la taille préférée de la mise en page.

  • itemAt(), comment itérer sur la mise en page.

  • PrenezAt(), comment supprimer des éléments de la mise en page.

Dans la plupart des cas, vous allez également implémenter minimumSize().

Ci-dessous j'ai copié la partie la plus importante du code dans l'exemple, pour votre commodité:

class CardLayout : public QLayout 
{ 
public: 
    CardLayout(QWidget *parent, int dist): QLayout(parent, 0, dist) {} 
    CardLayout(QLayout *parent, int dist): QLayout(parent, dist) {} 
    CardLayout(int dist): QLayout(dist) {} 
    ~CardLayout(); 

    void addItem(QLayoutItem *item); 
    QSize sizeHint() const; 
    QSize minimumSize() const; 
    int count() const; 
    QLayoutItem *itemAt(int) const; 
    QLayoutItem *takeAt(int); 
    void setGeometry(const QRect &rect); 

private: 
    QList<QLayoutItem*> list; 
}; 


void CardLayout::setGeometry(const QRect &r) 
{ 
    QLayout::setGeometry(r); 

    if (list.size() == 0) 
     return; 

    int w = r.width() - (list.count() - 1) * spacing(); 
    int h = r.height() - (list.count() - 1) * spacing(); 
    int i = 0; 
    while (i < list.size()) { 
     QLayoutItem *o = list.at(i); 
     QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h); 
     o->setGeometry(geom); 
     ++i; 
    } 
} 
+0

Je ne peux pas croire que je ne l'avais pas vu. Merci pour le lien et les détails ajoutés! – juef