2017-05-08 5 views
1

Nehmen wir an, wir Raster-Layout aussehen:Qt - Etiketten overlaping in Raster-Layout

this->layout = new QGridLayout; 

ClickableLabel *lab1 = new ClickableLabel(); 
this->layout->addWidget(lab1, 0, 0); 

ClickableLabel *lab2 = new ClickableLabel(); 
this->layout->addWidget(lab2, 1, 0); 

Ist es möglich, diese beiden ClickableLabels einander überlappen? Ich mache ein Kartenspiel und ich brauche die Karten (Etiketten), um zu überlappen wie in Solitaire. Jetzt ist meine Frage: Muss ich ein anderes Layout dafür verwenden? oder ich kann es mit etwas Trick wie setGeometry oder move. (nichts davon für mich gearbeitet)

+3

Wenn Sie sich überlappen möchten, verwenden Sie kein Rasterlayout und positionieren Sie die Widgets nicht selbst. – SPlatten

+0

Welches Layout sollte ich dafür verwenden? vertikal? – nocturne

+1

Keine, Sie müssen kein Layout verwenden, Sie können die Widgets auf dem Display selbst positionieren. Wenn Ihre Hauptanwendungsklasse von QMainWindow abgeleitet ist, können Sie direkt darauf rendern. – SPlatten

Antwort

2

die Überlappung Unter der Annahme ist ziemlich statisch Sie leicht multiple rows and/or columns, indem jede ClickableLabel Spannweite simulieren ...

this->layout = new QGridLayout; 

ClickableLabel *lab1 = new ClickableLabel(); 
this->layout->addWidget(lab1, 0, 0, 2/* Row span */, 1/* Column span */); 

ClickableLabel *lab2 = new ClickableLabel(); 
this->layout->addWidget(lab2, 1, 0, 2/* Row span */, 1/* Column span */); 

Im Beispiel oben lab1 belegt die Zeilen 0 und 1 und lab2 belegt die Zeilen 1 und 2 Daher überlappen sie sich in Zeile 1 mit der Z-Reihenfolge, die durch die Reihenfolge vorgegeben ist, in der sie hinzugefügt werden.

+0

Ich verstehe nicht, wie die Spannweite noch funktioniert, aber das könnte das sein, was ich suche – nocturne

1

ich QMainWindow für meine Anwendung bin mit und ich machen eine ganze Reihe von Widgets, die in XML-Dateien definiert sind, den Standort der Widgets wird in relativen Koordinaten angegeben. Das QMainWindow ist für das gesamte Display eingerichtet.

1

Bitte, tu das nicht so.

Wenn Sie ein Kartenspiel erstellen, müssen Sie Karten erstellen, keine Schaltflächen, auch können Sie sie nicht in Layouts einfügen. Das Problem ist, dass das Layout-Management-System von Qt alt ist und es nicht wirklich Elemente in den Monitor als erste Klassen ctzens berücksichtigt - es im Layout arrangieren, das ist es.

Wenn Sie in Kartenspielen und Qt sind, haben Sie zwei einfache Möglichkeiten:

1 - Old Style (und die, die ich wirklich wissen, wie man unterrichtet) - QGraphivsView

Erstellen Sie Ihre Karte Klasse basierend auf QGraphicsRectItem, und überschreiben Sie die Ereignisse mousePress und mouseRelease, um Klicken und Ziehen zu ermöglichen.

class Card : public QObject, public QGraphicsRectItem { 
Q_OBJECT 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *ev) 
    { 
     clicked(); 
     startDrag = true; 
    } 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *ev) 
    { 
     if(!startDrag) 
      return; 

     setPos(ev->pos()); 
     startDrag = false; 
    }  
    void mouseMoveEvent(QGraphicsSceneMouseEvent *ev) 
    { 
     if (!startDrag) 
      return(); 
     setPos(ev->pos()); 
    } 
signals: 
    void clicked(); 
}; 

erstellen Sie dann auch eine neue Klasse auf QGraphivsView basiert, die dem Board sein wird, und die Karten-Algorithmus auf der Grundlage Ihrer Verfügung zu arrangieren.

2 - Der Stil, den ich nicht lehren kann: QML.

+0

Gut danke für Ihre Erklärung, ich denke, ich habe nicht genug Zeit, um damit so viel zu spielen. – nocturne

+1

es wird weniger Zeit sein, das in QGraphivsView zu erstellen, als mit dem Layout-Problem umzugehen. –

+0

Ich habe es geschafft, was ich wollte. Aber nochmal danke. – nocturne

Verwandte Themen