Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Abgeleitete Klasse von QMdiSubWindow - setContentsMargins() funktioniert nicht



  • Hallo!

    Ich bin gerade dabei eine Subklasse von QMdiSubWindow zu schreiben, die ähnliche Funktionen wie QMainWindow aufweist. Dabei hab ich allerdings das Problem, dass das setzen vom Margin nicht zufriedenstellend funktioniert.

    Anbei ein Screenshot, der das Problem zeigt. Die blaue Box ist das Margin, so wie ich es gerne haben möchte. Die rote Box zeigt den derzeitigen Stand.
    mdi.png

    Als zentrale Widget verwende ich eine abgeleitete Klasse von QGraphicsView. Die Klasse hat kein Margin, wenn ich sie in einem QMainWindow verwende.

    Könnte bitte jemand den nachfolgenden Code kontrollieren und mir eventuell mitteilen, was hier schuld sein kann?

    WindowMDI.hpp:

    #include <QMdiSubWindow>
    #include <QMenuBar>
    #include <QStatusBar>
    #include <QToolBar>
    #include <QVBoxLayout>
    #include <QWidget>
    
    class WindowMDI : public QMdiSubWindow {
        Q_OBJECT
        
    public:
        WindowMDI(QWidget *parent);
        QMenuBar *menubar(void);
        QStatusBar *statusbar(void);
        void setCentralWidget(QWidget *widget);
        void addToolbar(QToolBar *toolbar);
        void addWidgetLeft(QWidget *widget);
        void addWidgetRight(QWidget *widget);
        void addCommandWidget(QWidget *widget);
        
    private:
        void createLayout(void);
        
        QVBoxLayout *m_layoutMain;
        QHBoxLayout *m_layoutCenter;
        QWidget *m_widgetMenubar;
        QWidget *m_widgetToolbar;
        QWidget *m_widgetLeft;
        QWidget *m_widgetCenter;
        QWidget *m_widgetRight;
        QWidget *m_widgetCommand;
        QWidget *m_widgetStatusbar;
        QMenuBar *m_menubar;
        QStatusBar *m_statusbar;
    };
    

    WindowMDI.cpp:

    #include <QLayout>
    
    #include "WindowMDI.hpp"
    
    void WindowMDI::createLayout(void)
    {
        QLayout *oldLayout;
        QVBoxLayout *ptrLayout;
        
        m_menubar = nullptr;
        m_statusbar = nullptr;
        setContentsMargins(0, 0, 0, 0);;
        oldLayout = layout();
        
        if (oldLayout != nullptr)
            delete oldLayout;
        
        m_layoutMain = new QVBoxLayout(this);
        m_layoutMain->setContentsMargins(0, 0, 0, 0);
        m_layoutCenter = new QHBoxLayout();
        m_layoutCenter->setContentsMargins(0, 0, 0, 0);
        
        m_widgetLeft = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetLeft);
        ptrLayout->setContentsMargins(0, 0, 0, 0);
        m_widgetLeft->setContentsMargins(0, 0, 0, 0);
        m_widgetLeft->setLayout(ptrLayout);
        
        m_widgetCenter = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetCenter);
        ptrLayout->setContentsMargins(0, 0, 0, 0);
        m_widgetCenter->setContentsMargins(0, 0, 0, 0);
        m_widgetCenter->setLayout(ptrLayout);
        
        m_widgetRight = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetRight);
        ptrLayout->setContentsMargins(0, 0, 0, 0);
        m_widgetRight->setContentsMargins(0, 0, 0, 0);
        m_widgetRight->setLayout(ptrLayout);
        
        m_layoutCenter->addWidget(m_widgetLeft);
        m_layoutCenter->addWidget(m_widgetCenter);
        m_layoutCenter->addWidget(m_widgetRight);
        
        m_widgetMenubar = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetMenubar);
        ptrLayout->setContentsMargins(0, 0, 0, 0);
        m_widgetMenubar->setContentsMargins(0, 0, 0, 0);
        m_widgetMenubar->setLayout(ptrLayout);
        
        m_widgetToolbar = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetToolbar);
        ptrLayout->setContentsMargins(0, 0, 0, 0);
        m_widgetToolbar->setContentsMargins(0, 0, 0, 0);
        m_widgetToolbar->setLayout(ptrLayout);
        
        m_widgetCommand = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetCommand);
        ptrLayout->setContentsMargins(0, 0, 0, 0);
        m_widgetCommand->setContentsMargins(0, 0, 0, 0);
        m_widgetCommand->setLayout(ptrLayout);
        
        m_widgetStatusbar = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetStatusbar);
        ptrLayout->setContentsMargins(0, 0, 0, 0);
        m_widgetStatusbar->setContentsMargins(0, 0, 0, 0);
        m_widgetStatusbar->setLayout(ptrLayout);
        
        m_layoutMain->addWidget(m_widgetMenubar);
        m_layoutMain->addWidget(m_widgetToolbar);
        m_layoutMain->addLayout(m_layoutCenter);
        m_layoutMain->addWidget(m_widgetCommand);
        m_layoutMain->addWidget(m_widgetStatusbar);
        m_layoutMain->setContentsMargins(0, 0, 0, 0);
        
        setLayout(m_layoutMain);
    }
    
    WindowMDI::WindowMDI(QWidget *parent) : QMdiSubWindow(parent)
    {
        createLayout();
    }
    
    QMenuBar* WindowMDI::menubar(void)
    {
        if (m_menubar == nullptr) {
            m_menubar = new QMenuBar(m_widgetMenubar);
            m_widgetMenubar->layout()->addWidget(m_menubar);
        }
        
        return m_menubar;
    }
    
    QStatusBar* WindowMDI::statusbar(void)
    {
        if (m_statusbar == nullptr) {
            m_statusbar = new QStatusBar(m_widgetStatusbar);
            m_widgetStatusbar->layout()->addWidget(m_statusbar);
        }
        
        return m_statusbar;
    }
    
    void WindowMDI::setCentralWidget(QWidget *widget)
    {
        if (widget == nullptr)
            return;
        
        m_widgetCenter->layout()->addWidget(widget);
    }
    
    void WindowMDI::addCommandWidget(QWidget *widget)
    {
        if (widget == nullptr)
            return;
        
        m_widgetCommand->layout()->addWidget(widget);
    }
    
    void WindowMDI::addToolbar(QToolBar *toolbar)
    {
        if (toolbar == nullptr)
            return;
        
        m_widgetToolbar->layout()->addWidget(toolbar);
    }
    
    void WindowMDI::addWidgetLeft(QWidget *widget)
    {
        if (widget == nullptr)
            return;
        
        m_widgetLeft->layout()->addWidget(widget);
    }
    
    void WindowMDI::addWidgetRight(QWidget *widget)
    {
        if (widget == nullptr)
            return;
        
        m_widgetRight->layout()->addWidget(widget);
    }
    

    Ich bin ein Neuling was Qt betrifft. Hatte bisher keine gröberen Probleme. Aber jetzt weiß ich nicht mehr weiter. Habe schon fast überall nach dem Problem gesucht, aber keine funktionierende Lösung gefunden.

    Vorweg vielen Dank!



  • Ich habe jetzt nach vielen Herumprobieren die Lösung gefunden.

    Die Reihenfolge ist anscheinend wichtig:

    Funktionierendes Schema:

    • QLayout anlegen/erstellen (new)
    • Layout einem Widget zuweisen
    • Mit widget->layout() die entsprechenden Parameter setzen

    Nicht funktionierendes Schema:

    • QLayout anlegen/erstellen (new)
    • Parameter setzen
    • Layout einem Widget zuweisen

    Und außerdem haben die Funktionen setMargin() und setSpacing() gefehlt.

    Anbei der funktionierende Codeabschnitt void WindowMDI::createLayout(void):

    void WindowMDI::createLayout(void)
    {
        QLayout *oldLayout;
        QVBoxLayout *ptrLayout;
        
        m_menubar = nullptr;
        m_statusbar = nullptr;
        oldLayout = layout();
        
        if (oldLayout != nullptr)
            delete oldLayout;
        
        m_layoutMain = new QVBoxLayout(this);
        m_layoutCenter = new QHBoxLayout();
        m_layoutCenter->setContentsMargins(0, 0, 0, 0);
        m_layoutCenter->setSpacing(0);
        m_layoutCenter->setMargin(0);
        
        m_widgetLeft = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetLeft);
        m_widgetLeft->setLayout(ptrLayout);
        m_widgetLeft->setContentsMargins(0, 0, 0, 0);
        m_widgetLeft->layout()->setContentsMargins(0, 0, 0, 0);
        m_widgetLeft->layout()->setSpacing(0);
        m_widgetLeft->layout()->setMargin(0);
        
        m_widgetCenter = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetCenter);
        m_widgetCenter->setLayout(ptrLayout);
        m_widgetCenter->setContentsMargins(0, 0, 0, 0);
        m_widgetCenter->layout()->setContentsMargins(0, 0, 0, 0);
        m_widgetCenter->layout()->setSpacing(0);
        m_widgetCenter->layout()->setMargin(0);
        
        m_widgetRight = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetRight);
        m_widgetRight->setLayout(ptrLayout);
        m_widgetRight->setContentsMargins(0, 0, 0, 0);
        m_widgetRight->layout()->setContentsMargins(0, 0, 0, 0);
        m_widgetRight->layout()->setSpacing(0);
        m_widgetRight->layout()->setMargin(0);
        
        m_layoutCenter->addWidget(m_widgetLeft);
        m_layoutCenter->addWidget(m_widgetCenter);
        m_layoutCenter->addWidget(m_widgetRight);
        
        m_widgetMenubar = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetMenubar);
        m_widgetMenubar->setLayout(ptrLayout);
        m_widgetMenubar->setContentsMargins(0, 0, 0, 0);
        m_widgetMenubar->layout()->setContentsMargins(0, 0, 0, 0);
        m_widgetMenubar->layout()->setSpacing(0);
        m_widgetMenubar->layout()->setMargin(0);
        
        m_widgetToolbar = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetToolbar);
        m_widgetToolbar->setLayout(ptrLayout);
        m_widgetToolbar->setContentsMargins(0, 0, 0, 0);
        m_widgetToolbar->layout()->setContentsMargins(0, 0, 0, 0);
        m_widgetToolbar->layout()->setSpacing(0);
        m_widgetToolbar->layout()->setMargin(0);
        
        m_widgetCommand = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetCommand);
        m_widgetCommand->setLayout(ptrLayout);
        m_widgetCommand->setContentsMargins(0, 0, 0, 0);
        m_widgetCommand->layout()->setContentsMargins(0, 0, 0, 0);
        m_widgetCommand->layout()->setSpacing(0);
        m_widgetCommand->layout()->setMargin(0);
        
        m_widgetStatusbar = new QWidget(this);
        ptrLayout = new QVBoxLayout(m_widgetStatusbar);
        m_widgetStatusbar->setLayout(ptrLayout);
        m_widgetStatusbar->setContentsMargins(0, 0, 0, 0);
        m_widgetStatusbar->layout()->setContentsMargins(0, 0, 0, 0);
        m_widgetStatusbar->layout()->setSpacing(0);
        m_widgetStatusbar->layout()->setMargin(0);
        
        m_layoutMain->addWidget(m_widgetMenubar);
        m_layoutMain->addWidget(m_widgetToolbar);
        m_layoutMain->addLayout(m_layoutCenter);
        m_layoutMain->addWidget(m_widgetCommand);
        m_layoutMain->addWidget(m_widgetStatusbar);
        
        setLayout(m_layoutMain);
        setContentsMargins(0, 0, 0, 0);;
        layout()->setContentsMargins(0, 0, 0, 0);
        layout()->setSpacing(0);
        layout()->setMargin(0);
    }
    

Log in to reply