KDDockWidgets API Documentation  1.4
MainWindow.cpp
Go to the documentation of this file.
1 /*
2  This file is part of KDDockWidgets.
3 
4  SPDX-FileCopyrightText: 2019-2021 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
5  Author: SĂ©rgio Martins <sergio.martins@kdab.com>
6 
7  SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
8 
9  Contact KDAB at <info@kdab.com> for commercial licensing options.
10 */
11 
19 #include "MainWindow.h"
20 #include "Config.h"
21 #include "FrameworkWidgetFactory.h"
22 
23 #include "private/DockRegistry_p.h"
24 #include "private/DropAreaWithCentralFrame_p.h"
25 #include "private/DropArea_p.h"
26 #include "private/Frame_p.h"
27 #include "private/Logging_p.h"
28 #include "private/SideBar_p.h"
29 
30 #include <QPainter>
31 #include <QScreen>
32 #include <QVBoxLayout>
33 #include <QWindow>
34 
35 // clazy:excludeall=ctor-missing-parent-argument,missing-qobject-macro
36 
37 using namespace KDDockWidgets;
38 
39 namespace KDDockWidgets {
40 class MyCentralWidget : public QWidget
41 {
42  Q_OBJECT
43 public:
44  explicit MyCentralWidget(QWidget *parent = nullptr)
45  : QWidget(parent)
46  {
47  setObjectName(QStringLiteral("MyCentralWidget"));
48  }
49 
50  ~MyCentralWidget() override;
51 
52  void resizeEvent(QResizeEvent *ev) override
53  {
55  Q_EMIT resized(ev->oldSize(), ev->size());
56  }
57 Q_SIGNALS:
58  void resized(QSize oldSize, QSize newSize);
59 };
60 }
61 
62 class MainWindow::Private
63 {
64 public:
65  explicit Private(MainWindowOptions, MainWindow *mainWindow)
66  : q(mainWindow)
67  , m_supportsAutoHide(Config::self().flags() & Config::Flag_AutoHideSupport)
68  , m_centralWidget(new MyCentralWidget(mainWindow))
69  , m_layout(new QHBoxLayout(m_centralWidget)) // 1 level of indirection so we can add some margins
70  {
71  if (m_supportsAutoHide) {
72  for (auto location : { SideBarLocation::North, SideBarLocation::East,
74  m_sideBars.insert(location, Config::self().frameworkWidgetFactory()->createSideBar(location, mainWindow));
75  }
76  }
77 
78  m_layout->setSpacing(0);
79  updateMargins();
80  }
81 
82  void updateMargins()
83  {
84  m_layout->setContentsMargins(q->centerWidgetMargins());
85  }
86 
87  MainWindow *const q;
88  const bool m_supportsAutoHide;
90  MyCentralWidget *const m_centralWidget;
91  QHBoxLayout *const m_layout;
92 };
93 
94 MyCentralWidget::~MyCentralWidget()
95 {
96 }
97 
98 
99 MainWindow::MainWindow(const QString &name, MainWindowOptions options,
100  QWidget *parent, Qt::WindowFlags flags)
101  : MainWindowBase(name, options, parent, flags)
102  , d(new Private(options, this))
103 {
104  if (d->m_supportsAutoHide) {
105  d->m_layout->addWidget(sideBar(SideBarLocation::West));
106  auto innerVLayout = new QVBoxLayout();
107  innerVLayout->setSpacing(0);
108  innerVLayout->setContentsMargins(0, 0, 0, 0);
109  innerVLayout->addWidget(sideBar(SideBarLocation::North));
110  innerVLayout->addWidget(layoutWidget());
111  innerVLayout->addWidget(sideBar(SideBarLocation::South));
112  d->m_layout->addLayout(innerVLayout);
113  d->m_layout->addWidget(sideBar(SideBarLocation::East));
114  } else {
115  d->m_layout->addWidget(layoutWidget());
116  }
117 
118  setCentralWidget(d->m_centralWidget);
119 
120  create();
121  connect(windowHandle(), &QWindow::screenChanged, DockRegistry::self(),
122  [this] {
123  d->updateMargins(); // logical dpi might have changed
124  Q_EMIT DockRegistry::self()->windowChangedScreen(windowHandle());
125  });
126 
127  connect(d->m_centralWidget, &MyCentralWidget::resized, this, &MainWindowBase::centralWidgetResized);
128 }
129 
131 {
132  delete d;
133 }
134 
135 void MainWindow::setCentralWidget(QWidget *w)
136 {
138 }
139 
140 SideBar *MainWindow::sideBar(SideBarLocation location) const
141 {
142  return d->m_sideBars.value(location);
143 }
144 
146 {
148  onResized(ev); // Also call our own handler, since QtQuick doesn't have resizeEvent()
149 }
150 
152 {
153  const QMargins margins = { 1, 5, 1, 1 };
154  return margins * logicalDpiFactor(this);
155 }
156 
158 {
159  return centralWidget()->geometry();
160 }
161 
162 #include "MainWindow.moc"
QObject::Q_OBJECT
Q_OBJECTQ_OBJECT
QVBoxLayout
QRect
QObject::Q_EMIT
Q_EMITQ_EMIT
KDDockWidgets::MainWindow::centerWidgetMargins
QMargins centerWidgetMargins() const override
Definition: MainWindow.cpp:151
KDDockWidgets::MainWindowBase::layoutWidget
LayoutWidget * layoutWidget() const
Definition: MainWindowBase.cpp:166
QWidget::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
QMainWindow::setCentralWidget
void setCentralWidget(QWidget *widget)
QWidget
KDDockWidgets::SideBarLocation::West
@ West
QSize
QResizeEvent::size
const QSize & size() const const
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Qt::WindowFlags
typedef WindowFlags
QResizeEvent::oldSize
const QSize & oldSize() const const
QString
KDDockWidgets::Config
Singleton to allow to choose certain behaviours of the framework.
Definition: Config.h:55
KDDockWidgets::MainWindow::centralAreaGeometry
QRect centralAreaGeometry() const override
Definition: MainWindow.cpp:157
KDDockWidgets::MainWindow::resizeEvent
void resizeEvent(QResizeEvent *) override
Definition: MainWindow.cpp:145
QMargins
KDDockWidgets::SideBarLocation
SideBarLocation
Each main window supports 4 sidebars.
Definition: KDDockWidgets.h:209
QObject::Q_SIGNALS
Q_SIGNALSQ_SIGNALS
KDDockWidgets::MainWindowBase::centralWidgetResized
void centralWidgetResized(QSize oldSize, QSize newSize)
emitted when the MainWindow::centralWidget() changes size
KDDockWidgets::SideBarLocation::East
@ East
QMainWindow::centralWidget
QWidget * centralWidget() const const
KDDockWidgets::SideBarLocation::South
@ South
Config.h
Application-wide config to tune certain behaviours of the framework.
QWindow::screenChanged
void screenChanged(QScreen *screen)
QWidget::windowHandle
QWindow * windowHandle() const const
MainWindow.h
QMainWindow sub-class to enable KDDockWidgets support.
KDDockWidgets::MainWindow
The QMainwindow sub-class that the application should use to be able to dock KDDockWidget::DockWidget...
Definition: MainWindow.h:33
KDDockWidgets::SideBarLocation::North
@ North
QResizeEvent
QObject::setObjectName
void setObjectName(const QString &name)
QHBoxLayout
KDDockWidgets
Definition: Config.cpp:36
QWidget::geometry
geometry
KDDockWidgets::MainWindowBase
The MainWindow base-class. MainWindow and MainWindowBase are only split in two so we can share some c...
Definition: MainWindowBase.h:56
KDDockWidgets::MainWindow::sideBar
SideBar * sideBar(SideBarLocation) const override
returns the sidebar for the specified location
Definition: MainWindow.cpp:140
QHash< SideBarLocation, SideBar * >
KDDockWidgets::MainWindowBase::onResized
void onResized(QResizeEvent *)
Definition: MainWindowBase.cpp:648
KDDockWidgets::MainWindow::~MainWindow
~MainWindow() override
Destructor.
Definition: MainWindow.cpp:130
QWidget::create
void create(WId window, bool initializeWindow, bool destroyOldWindow)
QObject::parent
QObject * parent() const const
KDDockWidgets::MainWindow::MainWindow
MainWindow(const QString &uniqueName, MainWindowOptions options=MainWindowOption_None, QWidget *parent=nullptr, Qt::WindowFlags flags=Qt::WindowFlags())
Constructor. Use it as you would use QMainWindow.
Definition: MainWindow.cpp:99
KDDockWidgets::Config::self
static Config & self()
returns the singleton Config instance
Definition: Config.cpp:82
FrameworkWidgetFactory.h
A factory class for allowing the user to customize some internal widgets.

© 2019-2021 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
KDDockWidgets
Advanced Dock Widget Framework for Qt
https://www.kdab.com/development-resources/qt-tools/kddockwidgets/
Generated on Mon Nov 15 2021 00:17:27 for KDDockWidgets API Documentation by doxygen 1.8.20