Layout über Code erzeugen



  • @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