Layout über Code erzeugen



  • Hi,
    ich versuche gerade ein Layout über den Code zu erzeugen.
    Natürlich geht das auch viel einfacher über den Designer wenn man eine .ui Datei hat.

    Bei folgendem Programm funktioniert das Layout nicht.
    Kann mir bitte jemand sagen warum und wie man es richtig über Code erzeugt.

    mainwindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QPushButton>
    #include <QHBoxLayout>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
        QPushButton *pushButton1, *pushButton2;
        QHBoxLayout *Layout;
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp:

    #include "mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        setGeometry(40,40,400,400);
    
        pushButton1 = new QPushButton(this);
        pushButton2 = new QPushButton(this);
    
        Layout = new QHBoxLayout;
        Layout->addWidget(pushButton1);
        Layout->addWidget(pushButton2);
    
        setLayout(Layout);
    }
    
    MainWindow::~MainWindow()
    {
    }
    

    main.cpp:

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
    
        w.show();
        return a.exec();
    }
    


  • @theAnfänger77

    funktioniert das Layout nicht.

    Das ist keine Fehlerbeschreibung.



  • Das Programm lässt sich ausführen, aber das Layout wird nicht angewendet.
    In der mainwindow.cpp wird also:

    setGeometry(40,40,400,400);
    

    angewendet, aber

    setLayout(Layout);
    

    nicht.



  • @theAnfänger77

    wird nicht angewendet

    ist auch nicht wirklich aussagekräftig.

    Hier werden die Buttons ohne Parentzeiger erzeugt.



  • Bei folgendem Programm funktioniert es und ein Layout wird erzeugt.
    Allerdings ist das eine Qt Konsolenanwendung.

    #include <QApplication>
    #include <QPushButton>
    #include <QHboxLayout>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget *window = new QWidget;
    
        QPushButton *pushButton1 = new QPushButton("Eins");
        QPushButton *pushButton2 = new QPushButton("Zwei");
    
        QHBoxLayout *layout = new QHBoxLayout;
        layout->addWidget(pushButton1);
        layout->addWidget(pushButton2);
    
        window->setLayout(layout);
    
        window->show();
    
        return a.exec();
    }
    

    Aber warum es bei einer Qt Widgets Anwendung nicht funktoniert verstehe ich nicht.



  • @theAnfänger77
    Konsolenanwendung mit GUI - ist klar.

    Liest du die Antworten auch mal?



  • Bei dem ersten Programm müssten die beiden Labels eigentlich nebeneinander gezeigt werden.
    Das geschieht aber nicht.
    Dafür verdeckt das 2. Label das 1.



  • @manni66 sagte in Layout über Code erzeugen:

    @theAnfänger77
    Liest du die Antworten auch mal?



  • Wegen dem Parentzeiger?
    Im Programm oben sind die Buttons doch auch ohne Parentzeiger.

    Oder wegen der Fehlerbeschreibung?
    Es handelt sich um einen reinen Laufzeitfehler.
    Meldungen werden keine erzeugt.



  • @theAnfänger77 sagte in Layout über Code erzeugen:

    Im Programm oben sind die Buttons doch auch ohne Parentzeiger

    ???

    pushButton1 = new QPushButton(this);



  • Ok.
    Aber das muss so sein.
    Sonst werden die Buttons doch nicht im Fenster angezeigt.



  • @theAnfänger77

    Sonst werden die Buttons doch nicht im Fenster angezeigt.

    Jaja, es sei denn, die GUI läuft in einer Konsolenanwendung ..

    Ich geb’s auf ...



  • Wir reden von folgender Konsolenanwendung:
    .pro Datei:

    QT -= gui
    
    CONFIG += c++11 console
    CONFIG -= app_bundle
    
    # The following define makes your compiler emit warnings if you use
    # any Qt feature that has been marked deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
            main.cpp
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    

    main.cpp:

    #include <QCoreApplication>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        return a.exec();
    }
    

    es handelt sich nicht um ein Projekt ohne Qt, sondern um eine Qt Konsolenanwendung.



  • Der Inhalt von einem QMainWindow ist ein centralWidget. Das musst du erstellen und mit setCentralWidget setzen. Das kann einfach ein QWidget sein, und auf dem wiederum setzt du dein Layout.
    Ob parent Zeiger oder nicht ist soweit egal. Wenn ein Widget keinen Parent hat, wird der vom Layout übernommen.



  • 🙂 Super!
    Vielen Dank für die Lösung!

    So sieht es dann aus:
    mainwindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QPushButton>
    #include <QHBoxLayout>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
        QPushButton *pushButton1, *pushButton2;
        QHBoxLayout *Layout;
        QWidget *centralWidget;
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp:

    #include "mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        setGeometry(400,400,1000,1000);
    
        pushButton1 = new QPushButton(this);
        pushButton2 = new QPushButton(this);
    
        Layout = new QHBoxLayout;
        Layout->addWidget(pushButton1);
        Layout->addWidget(pushButton2);
    
        centralWidget = new QWidget;
        setCentralWidget(centralWidget);
        centralWidget->setLayout(Layout);
    }
    
    MainWindow::~MainWindow()
    {
    }
    


  • @theAnfänger77 sagte in Layout über Code erzeugen:

        centralWidget = new QWidget;
    

    Wieso hat das keinen Parent? Das leckt.

    @theAnfänger77 sagte in Layout über Code erzeugen:

    MainWindow::~MainWindow()
    {
    }
    

    Warum?



  • Nein.





  • @Swordfish sagte in Layout über Code erzeugen:

    @theAnfänger77 sagte in Layout über Code erzeugen:

        centralWidget = new QWidget;
    

    Wieso hat das keinen Parent? Das leckt.

    @theAnfänger77 sagte in Layout über Code erzeugen:

    MainWindow::~MainWindow()
    {
    }
    

    Warum?

    In dem Fall braucht das Widget keinen Parent, weil es über "setCentralWidget" ohnehin zugeordnet wird. Das ist schon ok. Der Form halber könnte man es natürlich trotzdem machen. Die Pushbuttons brauchen glaube auch keinen Parent, weil die ebenfalls über "addWidget" dem Layout zuordnet werden.


Log in to reply