In Qt im WIndow Konstruktor Größe abfragen



  • Hallo,

    ich benötige um etwas auszurichten von einem Element in meinem Formular die Breite. Das Ausrichten wollte ich im Konstruktor des Fensters machen. Das Formular ist mit QDesigner erstellt, und wird auch im Konstruktor initialisiert.

    Nun frage ich testweise ganz am Ende des Fenster Konstruktors Element.width() ab. Dort bekomme ich eine kleinere als die tatsächliche Breite. Wenn ich später im Programm die Breite abfrage bekomme ich den richtigen Wert. Kann sich das eiener erklären?



  • Verwendest du denn einen Layout-Manager (QLayout und Derivate)?
    Ansonsten ist der Konstruktor erst der erste Schritt zum fertigen Fenster. Danach gibt es noch show() und resize().
    Letzteres wäre der Punkt in dem du ansetzen könntest. Implementiere das resizeEvent().

    Aber warum brauchst eigentlich die Breite? Und brauchst du das Ding wirklich schon im Konstruktor?



  • In meinem Formular habe ich im Designer mehrere Layouts angelegt. Im Konstruktor rufe ich als erstes:

    setupUi(this);

    auf.

    Die Breite benötige ich, um ein Element auszurichten.



  • Ralf3 schrieb:

    Die Breite benötige ich, um ein Element auszurichten.

    ausrichten == "layout". Warum ist es dir nicht möglich dieses eine Element ebenfalls in ein Layout zu packen?

    Ansonsten bin ich mir jetzt sicher, dass das Ausrichten nicht im Konstruktor geschehen muss. Lösung wie gesagt -> resizeEvent() zum Ausrichten hernehmen. Da kannst du dann auch gleich auf JEDES resizen reagieren, nicht nur auf das initiale (welches wie gesagt eh erst geschieht NACHDEM das Objekt fertig konstruiert ist).



  • Das ausrichten ist notwendig, da sich die Ausrichtung im Programm verändern kann. Das ResizeEvent habe ich jetzt reimplementiert, und zuerst:

    QMainWindow::resizeEvent(event);

    aufgerufen, und danach die Größe Abgefragt, und diese ist immer noch kleiner als im laufenden Programm.



  • Zum letzten Mal: Du hast keine Chance, im Konstruktor die Größe zu bekommen, die das Widget später hat, wenn es angezeigt wird!
    Und resizeEvent rufst du bitte nicht auf, wenn dann resize() was ein resizeEvent() triggert.
    Du willst NUR in resizeEvent die neue Größe abfragen und dann dein Element ausrichten. Nicht resizeEvent aufrufen oder sonstwas.
    Wenn du ein neues Widget anlegst, wird der Konstruktor aufgerufen. Danach wird dein Widget in der Größe angepasst (wohl durch das layout), das wird dir mitgeteilt mit dem resizeEvent. Danach gibt es das showEvent().
    Das resizeEvent wird bei jedem resize aufgerufen.



  • Ich habe es ja jetzt so aufgerufen:

    void MWindow::resizeEvent(QResizeEvent *event) {
        QMainWindow::resizeEvent(event);
        qDebug()<<"resize"<<box->width();
    }
    

    Also nciht im Konstruktor. Und da kommt immer noch die falsche Größe. Wie sollte ich es denn mit resize() machen?



  • Ralf3 schrieb:

    Also nciht im Konstruktor. Und da kommt immer noch die falsche Größe. Wie sollte ich es denn mit resize() machen?

    🙄
    Lies dir doch die Doku durch. Wenn dein "box" in keinem Layout liegt, bist du für die Größe zuständig. Du sollst jetzt im resizeEvent diese neue Größe setzen. Die neue Größe steht im QResizeEvent-Objekt, welches dir geschickt wird.



  • Die Box liegt ja in einem Layout. Diese Größe brauche ich für die Ausrichtung eines anderen Elements. Später im Programm ist sie ja auch korrekt, ohne mein Zutun.



  • Ralf3 schrieb:

    Die Box liegt ja in einem Layout.

    Wenn das jenige Layout nicht Kind von MWindow ist, bringt das gar nix.
    Bitte poste jetzt mal konkreten Code, der dein Problem verdeutlicht. Das sollte dann ein kompilierbares Minimalbeispiel sein (ohne Ballast wie Berechnungen und sonstiges was für das Problem irrelevant ist).


Anmelden zum Antworten