Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Abgeleitete Klasse von QMdiSubWindow - setContentsMargins() funktioniert nicht
QtWS25 Last Chance

Abgeleitete Klasse von QMdiSubWindow - setContentsMargins() funktioniert nicht

Scheduled Pinned Locked Moved Unsolved German
2 Posts 1 Posters 262 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #1

    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!

    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by A Former User
      #2

      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);
      }
      
      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved