Frage

Wie ist es möglich, Widgets Seitenverhältnis in Qt und was ist das Zentrieren des Widget zu halten?

War es hilfreich?

Lösung

Sie müssen keine eigenen Layout-Manager implementieren. Sie können mit tun QWidget vererben und Neuimplementierung

int QWidget::heightForWidth( int w ) { return w; }

bleiben Platz. Allerdings ist heightForWidth() nicht auf Top-Level-Fenster auf X11 arbeiten, da anscheinend das X11-Protokoll nicht, dass unterstützen. Wie zum Zentrieren, können Sie Qt::AlignCenter als dritten Parameter von QBoxLayout::addWidget() oder dem fünften Parameter von QGridLayout::addWidget() passieren.

Hinweis: In neueren Versionen von Qt zumindest nicht QWidget nicht die heightForWidth oder widthForHeight mehr (so dass sie nicht außer Kraft gesetzt werden) und daher setWidthForHeight(true) oder setHeightForWidth(true) nur für Nachkommen von QGraphicsLayout eine Wirkung hat.

Andere Tipps

Die richtige Antwort ist Ihren benutzerdefinierte Layout-Manager zu erstellen. Das ist möglich durch Subklassen QLayout .

Methoden zu implementieren, wenn Subklassen QLayout

  
Leere addItem (QLayoutItem * item);
  
Fügt Element an das Layout.
  
int count () const;
  
Gibt die Elementanzahl.
  
QLayoutItem * ITEMAT (int index) const;
  
Liefert die Artikelreferenz bei Index oder 0, wenn es keine ist.
  
QLayoutItem * takeAt (int index);
  
nimmt und Artikel aus dem Layout aus dem Index oder 0 zurück, wenn es keine gibt.
  
Qt :: Orientations expandingDirections () const;
  
Gibt die Layouts Richtungen erweitert.
  
bool hasHeightForWidth () const;
  
Gibt an, ob das Layout Griff Höhe für die Berechnung der Breite.
  
Qsize MinimumSize- () const;
  
Gibt die Layouts Mindestgröße.
  
Leere setGeometry (const QRect & rect);
  
Stellt die Geometrie des Layouts und die darin enthaltenen Elemente. Hier müssen Sie das Seitenverhältnis beibehalten und tun, um die Zentrierung.
  
Qsize sizeHint () const;
  
Gibt die bevorzugte Größe für das Layout.

Weiterführende Literatur

Beim resize() aus resizeEvent() gearbeitet hat nie gut für mich - im besten Fall wird es dazu führen, Flimmern, wenn das Fenster zweimal geändert wird (wie Sie), im schlimmsten Fall eine Endlosschleife

.

Ich denke, die „richtige“ Art und Weise ein festes Seitenverhältnis beizubehalten ist ein benutzerdefiniertes Layout zu erstellen. Sie müssen nur zwei Methoden außer Kraft setzen müssen, QLayoutItem::hasHeightForWidth() und QLayoutItem::heightForWidth().

In meinem Fall zwingende heightForWidth () funktioniert nicht. Und für jemanden, könnte es hilfreich sein, funktionierendes Beispiel zu bekommen Veranstaltungs die Größe verwendet wird.

Auf den ersten Unterklasse QObject Filter zu erstellen. Mehr über Ereignisfilter.

class FilterObject:public QObject{
public:
    QWidget *target = nullptr;//it holds a pointer to target object
    int goalHeight=0;
    FilterObject(QObject *parent=nullptr):QObject(parent){}//uses QObject constructor
    bool eventFilter(QObject *watched, QEvent *event) override;//and overrides eventFilter function
};

Dann event Funktion. Es ist Code sollte außerhalb von FilterObject Definition definiert werden Warnung zu verhindern. Dank dieser Antwort.

bool FilterObject::eventFilter(QObject *watched, QEvent *event) {
    if(watched!=target){//checks for correct target object.
        return false;
    }
    if(event->type()!=QEvent::Resize){//and correct event
        return false;
    }

    QResizeEvent *resEvent = static_cast<QResizeEvent*>(event);//then sets correct event type

    goalHeight = 7*resEvent->size().width()/16;//calculates height, 7/16 of width in my case
    if(target->height()!=goalHeight){
        target->setFixedHeight(goalHeight);
    }

    return true;
};

Und dann in Hauptcode erstellen FilterObject und legen Sie es als Eventfilter-Listener-Objekt zu zielen. Dank dieser Antwort.

FilterObject *filter = new FilterObject();
QWidget *targetWidget = new QWidget();//let it be target object
filter->target=targetWidget;
targetWidget->installEventFilter(filter);

Jetzt filtern alle Ereignisse des targetWidget erhalten und richtige Höhe bei Grßenänderungsereignis eingestellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top