[gelöst]layout().addWidget(widget); wie Position von widget ändern?



  • Hallo,
    ich erstelle in meiner main(); ein Widget dass ich dann auf die Form bringe (siehe Titel).
    Aber das Widget sucht sich die Position bisher willkürlich aus, wie kann ich diese ändern?

    Gruß



  • Zeig bitte mehr Code.
    Ich rate trotzdem mal: layout() gibt nur ein QLayout* zurück. Du willst wahrscheinlich was spezialisiertes, z.B. ein QVBoxLayout. da musst du erst qobject_cast<>()en.
    Aber in der main() in das layout() einer Form (meinst du ein mit dem designer generiertes .ui?) sieht mir stark nach Misverständnis aus 🙂
    Also zeig allen (wichtigen, lieber mehr als zu wenig) Code.



  • ActiveO2 schrieb:

    Aber das Widget sucht sich die Position bisher willkürlich aus

    nein, eigentlich nicht. Ist es das einzige Widget im Layout, nimmt es, entsprechende sizePolicy vorausgesetzt, die Größe des Layouts und dieses die Größe des umschließenden Widgets an.

    addWidget fügt das Widget an letzter Position ein. In einem VBoxLayout also unten, in einem HBoxLayout rechts. Solltest du es wo anders einfügen wollen, nutze insertWidget



  • ➡

    MainXX::MainXX(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainXX)
    {
    QWidget *wid = new QWidget;
    
    QGridLayout *gLayout= new QGridLayout(this);
    
    QLabel *text = new QLabel("Test");
    QLabel *text_2 = new QLabel("Test_2");
    
    gLayout->addWidget(text, 0, 0);
    gLayout->addWidget(text_2, 0, 1);
    ...
    
    wid->setLayout(gLayout);
    
    layout()->addWidget(wid); //die Position von "wid" würde ich gerne verändern
    
    ui->setupUi(this);
    }
    

    Bei mir wird der Code als ganz normaler Text angezeigt, bei euch auch? (BB-Codes sind eingeschaltet)
    Hoffe man erkennt mein Problem 😉

    PS: also muss ich ein QBoxLayout erstellen?



  • layout()->addWidget(wid); //die Position von "wid" würde ich gerne verändern
    
    ui->setupUi(this);
    }
    

    Das kann doch nur schief gehen! (Misverständnis :P)
    Du erstellst ein Widget (mit Layout), fügst es im Konstruktor in this->layout() ein, und DANACH lässt du auf this das setupUi() los. setupUi() modifiziert this, so dass es genau so ausschaut, wie im Designer. Das interessiert ein bereits gesetztes layout() nicht.

    Hinzu kommt ein zweites Misverständnis: Das Layout eines QMainWindow wird benötigt, um das centralWidget(), die dockWidgets, toolBar und menuBar anzuordnen. Für ein eigenes "mainWidget" gibt es nur (set)centralWidget(). Dass ein mainWindow->layout()->addWidget(); in die Hose geht dürfte jetzt klar sein.

    Zur Lösung:
    entweder alles im Designer erstellen (sollte echt kein Thema sein, vor allem, wenn du nur Built-in-Widgets ala QLabel etc. verwendest, mit eigenen Kreationen gibt es auch Lösungen).
    Oder eben

    MainXX::MainXX() <Basis + Elementinitialisierer wie gehabt)
    {
        ui->setupUi(this);
        <erstelle dein Widget "wid" mit Layout wie gehabt>
        setCentralWidget( wid );
    }
    

    Ich fände Ersteres besser, dann hast du im Konstruktor eigentlich nur ein setupUi() stehen.



  • setupUi() modifiziert this, so dass es genau so ausschaut, wie im Designer. Das interessiert ein bereits gesetztes layout() nicht.

    Also das Widget wird (bei mir) trotzdem angezeigt.

    Aber du hast Recht, im Grunde reicht es über die .ui.
    Mit der 2. Lösung hätte ich dann ja wieder das selbe Problem 😉



  • ActiveO2 schrieb:

    setupUi() modifiziert this, so dass es genau so ausschaut, wie im Designer. Das interessiert ein bereits gesetztes layout() nicht.

    Also das Widget wird (bei mir) trotzdem angezeigt.

    Aber du hast Recht, im Grunde reicht es über die .ui.
    Mit der 2. Lösung hätte ich dann ja wieder das selbe Problem 😉

    Klar wird es angezeigt, es hat ja ein parent, welches visible() ist 🙂 Aber es wird eben nicht korrekt angezeigt, da das Layout ein recht spezielles ist!

    Und klar ist die zweite Lösung eine Lösung!
    Wenn du im Designer deinem MainWindow nur menuBar, dockWidgets, toolBar etc spendierst und konfigurierst, und auf ein Füllen des centralWidget verzichtest, ist eben dieses noch frei und du kannst nach Belieben ein eigenes erstellen und mittels setCentralWidget hinzufügen. Du musst halt das

    layout()->addWidget(wid);
    

    in ein

    setCentralWidget(wid);
    

    abändern.

    Aber jetzt machst du es eh über die .ui.
    Solltest du aber mal ein eigenes Widget (also eines, das du selber implementierst, von QWidget abgeleitet (eben eine eigene Widget-Klasse), dann kannst du das auch gleich im Designer erledigen:

    1. Füge im Designer das Widget ein, von dem deine spezielle Widget-Klasse erbt, z.B. QFrame. (-> class MyWidget : public QFrame {...}; )
    2. Rechts-Klick auf dieses Widget -> Promote to -> und dann Klassenname und Header eintragen.
    3. Projekt kompilieren, fertig 🙂


  • danke, kann ich bestimmt mal gebrauchen!


Log in to reply