Skip to content

Commit 1a11e5d

Browse files
committed
Central Widget concept added
Adde option to set a dock widget as central widget. It influences resizing behavior of the splitters. The central widget will be stretched with the main window and remaing dock widgets and threir respective areas will be resized only vertically if docked left or right and horizontaly if docked top or bottom
1 parent c44d0c8 commit 1a11e5d

20 files changed

+629
-29
lines changed

examples/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ cmake_minimum_required(VERSION 3.5)
22
project(QtADSExamples LANGUAGES CXX VERSION ${VERSION_SHORT})
33
add_subdirectory(simple)
44
add_subdirectory(sidebar)
5-
add_subdirectory(deleteonclose)
5+
add_subdirectory(deleteonclose)
6+
add_subdirectory(centralWidget)

examples/centralWidget/CMakeLists.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
project(ads_example_centralwidget VERSION ${VERSION_SHORT})
3+
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
4+
set(CMAKE_INCLUDE_CURRENT_DIR ON)
5+
add_executable(CentralWidgetExample WIN32
6+
main.cpp
7+
mainwindow.cpp
8+
mainwindow.ui
9+
digitalclock.cpp
10+
)
11+
target_include_directories(CentralWidgetExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
12+
target_link_libraries(CentralWidgetExample PRIVATE qtadvanceddocking)
13+
target_link_libraries(CentralWidgetExample PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
14+
set_target_properties(CentralWidgetExample PROPERTIES
15+
AUTOMOC ON
16+
AUTORCC ON
17+
AUTOUIC ON
18+
CXX_STANDARD 14
19+
CXX_STANDARD_REQUIRED ON
20+
CXX_EXTENSIONS OFF
21+
VERSION ${VERSION_SHORT}
22+
EXPORT_NAME "Qt Advanced Docking System Central Widget Example"
23+
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
24+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
25+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
26+
)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
ADS_OUT_ROOT = $${OUT_PWD}/../..
2+
3+
QT += core gui
4+
5+
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
6+
7+
TARGET = CentralWidgetExample
8+
DESTDIR = $${ADS_OUT_ROOT}/lib
9+
TEMPLATE = app
10+
CONFIG += c++14
11+
CONFIG += debug_and_release
12+
13+
# The following define makes your compiler emit warnings if you use
14+
# any Qt feature that has been marked deprecated (the exact warnings
15+
# depend on your compiler). Please consult the documentation of the
16+
# deprecated API in order to know how to port your code away from it.
17+
DEFINES += QT_DEPRECATED_WARNINGS
18+
19+
# You can also make your code fail to compile if it uses deprecated APIs.
20+
# In order to do so, uncomment the following line.
21+
# You can also select to disable deprecated APIs only up to a certain version of Qt.
22+
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
23+
24+
SOURCES += \
25+
digitalclock.cpp \
26+
main.cpp \
27+
mainwindow.cpp
28+
29+
HEADERS += \
30+
digitalclock.h \
31+
mainwindow.h
32+
33+
FORMS += \
34+
mainwindow.ui
35+
36+
LIBS += -L$${ADS_OUT_ROOT}/lib
37+
38+
# Dependency: AdvancedDockingSystem (shared)
39+
CONFIG(debug, debug|release){
40+
win32 {
41+
LIBS += -lqtadvanceddockingd
42+
}
43+
else:mac {
44+
LIBS += -lqtadvanceddocking_debug
45+
}
46+
else {
47+
LIBS += -lqtadvanceddocking
48+
}
49+
}
50+
else{
51+
LIBS += -lqtadvanceddocking
52+
}
53+
54+
INCLUDEPATH += ../../src
55+
DEPENDPATH += ../../src
56+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "digitalclock.h"
2+
3+
#include <QTime>
4+
#include <QTimer>
5+
6+
CDigitalClock::CDigitalClock(QWidget *parent)
7+
: QLCDNumber(parent)
8+
{
9+
setDigitCount(8);
10+
setSegmentStyle(Filled);
11+
12+
QTimer *timer = new QTimer(this);
13+
connect(timer, &QTimer::timeout, this, &CDigitalClock::showTime);
14+
timer->start(1000);
15+
16+
showTime();
17+
18+
setWindowTitle(tr("Digital Clock"));
19+
resize(150, 60);
20+
}
21+
22+
void CDigitalClock::showTime()
23+
{
24+
QTime time = QTime::currentTime();
25+
QString text = time.toString("hh:mm:ss");
26+
display(text);
27+
}

examples/centralWidget/digitalclock.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef DIGITALCLOCK_H
2+
#define DIGITALCLOCK_H
3+
4+
#include <QLCDNumber>
5+
6+
class CDigitalClock : public QLCDNumber
7+
{
8+
Q_OBJECT
9+
10+
public:
11+
CDigitalClock(QWidget *parent = nullptr);
12+
13+
private slots:
14+
void showTime();
15+
};
16+
17+
#endif // DIGITALCLOCK_H

examples/centralWidget/main.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "mainwindow.h"
2+
3+
#include <QApplication>
4+
5+
int main(int argc, char *argv[])
6+
{
7+
QApplication a(argc, argv);
8+
CMainWindow w;
9+
w.show();
10+
return a.exec();
11+
}

examples/centralWidget/mainwindow.cpp

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
#include "mainwindow.h"
2+
#include "ui_mainwindow.h"
3+
#include "digitalclock.h"
4+
5+
#include <QWidgetAction>
6+
#include <QLabel>
7+
#include <QCalendarWidget>
8+
#include <QTreeView>
9+
#include <QFileSystemModel>
10+
#include <QTableWidget>
11+
#include <QHBoxLayout>
12+
#include <QRadioButton>
13+
#include <QPushButton>
14+
#include <QInputDialog>
15+
#include <QFileDialog>
16+
#include <QSettings>
17+
#include <QMessageBox>
18+
19+
#include "DockAreaWidget.h"
20+
#include "DockAreaTitleBar.h"
21+
#include "DockAreaTabBar.h"
22+
#include "FloatingDockContainer.h"
23+
#include "DockComponentsFactory.h"
24+
25+
using namespace ads;
26+
27+
const QString CMainWindow::kTableTopLayout = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
28+
"<QtAdvancedDockingSystem Version=\"1\" UserVersion=\"0\" Containers=\"1\">"
29+
"<Container Floating=\"0\">"
30+
"<Splitter Orientation=\"-\" Count=\"3\">"
31+
"<Area Tabs=\"1\" Current=\"Timeline\" AllowedAreas=\"f\" Flags=\"1\">"
32+
"<Widget Name=\"Timeline\" Closed=\"0\" />"
33+
"</Area>"
34+
"<Splitter Orientation=\"|\" Count=\"3\">"
35+
"<Splitter Orientation=\"-\" Count=\"2\">"
36+
"<Area Tabs=\"1\" Current=\"File system\">"
37+
"<Widget Name=\"File system\" Closed=\"0\"/>"
38+
"</Area>"
39+
"<Area Tabs=\"1\" Current=\"Table\">"
40+
"<Widget Name=\"Table\" Closed=\"0\"/>"
41+
"</Area>"
42+
"<Sizes>344 272 </Sizes>"
43+
"</Splitter>"
44+
"<Area Tabs=\"1\" Current=\"\" AllowedAreas=\"f\" Flags=\"1\">"
45+
"<Widget Name=\"CentralWidget\" Closed=\"0\"/>"
46+
"</Area>"
47+
"<Area Tabs=\"1\" Current=\"Properties\">"
48+
"<Widget Name=\"Properties\" Closed=\"0\"/>"
49+
"</Area>"
50+
"<Sizes>258 758 258 </Sizes>"
51+
"</Splitter>"
52+
"<Area Tabs=\"1\" Current=\"Status\" AllowedAreas=\"f\" Flags=\"1\">"
53+
"<Widget Name=\"Status\" Closed=\"0\"/>"
54+
"</Area>"
55+
"<Sizes>52 621 52 </Sizes>"
56+
"</Splitter>"
57+
"</Container>"
58+
"</QtAdvancedDockingSystem>";
59+
60+
const QString CMainWindow::kTableBottomLayout = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
61+
"<QtAdvancedDockingSystem Version=\"1\" UserVersion=\"0\" Containers=\"1\">"
62+
"<Container Floating=\"0\">"
63+
"<Splitter Orientation=\"-\" Count=\"3\">"
64+
"<Splitter Orientation=\"|\" Count=\"3\">"
65+
"<Area Tabs=\"2\" Current=\"Table\">"
66+
"<Widget Name=\"Table\" Closed=\"0\"/>"
67+
"<Widget Name=\"File system\" Closed=\"0\"/>"
68+
"</Area>"
69+
"<Area Tabs=\"1\" Current=\"\" AllowedAreas=\"f\" Flags=\"1\">"
70+
"<Widget Name=\"CentralWidget\" Closed=\"0\"/>"
71+
"</Area>"
72+
"<Area Tabs=\"1\" Current=\"Properties\">"
73+
"<Widget Name=\"Properties\" Closed=\"0\"/>"
74+
"</Area>"
75+
"<Sizes>258 758 258 </Sizes>"
76+
"</Splitter>"
77+
"<Area Tabs=\"1\" Current=\"Timeline\" AllowedAreas=\"f\" Flags=\"1\">"
78+
"<Widget Name=\"Timeline\" Closed=\"0\"/>"
79+
"</Area>"
80+
"<Area Tabs=\"1\" Current=\"Status\" AllowedAreas=\"f\" Flags=\"1\">"
81+
"<Widget Name=\"Status\" Closed=\"0\"/>"
82+
"</Area>"
83+
"<Sizes>621 52 52 </Sizes>"
84+
"</Splitter>"
85+
"</Container>"
86+
"</QtAdvancedDockingSystem>";
87+
88+
CMainWindow::CMainWindow(QWidget *parent)
89+
: QMainWindow(parent)
90+
, ui(new Ui::CMainWindow)
91+
{
92+
ui->setupUi(this);
93+
CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true);
94+
CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false);
95+
DockManager = new CDockManager(this);
96+
QCalendarWidget* calendar = new QCalendarWidget();
97+
CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
98+
CentralDockWidget->setWidget(calendar);
99+
CentralDockWidget->setFeature(CDockWidget::DockWidgetClosable, false);
100+
CentralDockWidget->setFeature(CDockWidget::DockWidgetMovable, false);
101+
CentralDockWidget->setFeature(CDockWidget::DockWidgetFloatable, false);
102+
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);
103+
CentralDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
104+
CentralDockArea->setDockAreaFlag(CDockAreaWidget::eDockAreaFlag::HideSingleWidgetTitleBar, true);
105+
106+
QTreeView* fileTree = new QTreeView();
107+
fileTree->setFrameShape(QFrame::NoFrame);
108+
QFileSystemModel* fileModel = new QFileSystemModel(fileTree);
109+
fileModel->setRootPath(QDir::currentPath());
110+
fileTree->setModel(fileModel);
111+
CDockWidget* DataDockWidget = new CDockWidget("File system");
112+
DataDockWidget->setWidget(fileTree);
113+
DataDockWidget->resize(150, 250);
114+
DataDockWidget->setMinimumSize(100, 250);
115+
auto* fileArea = DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, DataDockWidget, CentralDockArea);
116+
117+
QTableWidget* table = new QTableWidget();
118+
table->setColumnCount(3);
119+
table->setRowCount(10);
120+
CDockWidget* TableDockWidget = new CDockWidget("Table");
121+
TableDockWidget->setWidget(table);
122+
TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
123+
TableDockWidget->resize(250, 150);
124+
TableDockWidget->setMinimumSize(200,150);
125+
DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, TableDockWidget, fileArea);
126+
127+
QTableWidget* propertiesTable = new QTableWidget();
128+
table->setColumnCount(3);
129+
table->setRowCount(10);
130+
CDockWidget* PropertiesDockWidget = new CDockWidget("Properties");
131+
PropertiesDockWidget->setWidget(propertiesTable);
132+
PropertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
133+
PropertiesDockWidget->resize(250, 150);
134+
PropertiesDockWidget->setMinimumSize(200,150);
135+
DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, PropertiesDockWidget, CentralDockArea);
136+
137+
QWidget* timeLineWidget = new QWidget();
138+
QHBoxLayout* timelineLayout = new QHBoxLayout(timeLineWidget);
139+
QRadioButton* radioDockTop = new QRadioButton("Top", timeLineWidget);
140+
QRadioButton* radioDockBottom = new QRadioButton("Bottom", timeLineWidget);
141+
radioDockTop->setChecked(true);
142+
timelineLayout->addWidget(new QLabel("Fixed height Dock widget."));
143+
timelineLayout->addStretch(1);
144+
timelineLayout->addWidget(new QLabel("Apply predefined perspective: ", this));
145+
timelineLayout->addWidget(radioDockTop);
146+
timelineLayout->addWidget(radioDockBottom);
147+
TimelineDockWidget = new CDockWidget("Timeline");
148+
TimelineDockWidget->setWidget(timeLineWidget);
149+
// TimelineDockWidget->setResizeMode(CDockWidget::eResizeMode::ResizeHorizontal);
150+
TimelineDockWidget->setFeature(CDockWidget::DockWidgetClosable, false);
151+
TimelineDockWidget->setFeature(CDockWidget::DockWidgetMovable, false);
152+
TimelineDockWidget->setFeature(CDockWidget::DockWidgetFloatable, false);
153+
TimelineDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
154+
TimelineDockWidget->setMinimumSize(QSize(50, 50));
155+
TimelineDockWidget->setFixedHeight(50);
156+
auto *TimelineDockArea = DockManager->addDockWidget(DockWidgetArea::TopDockWidgetArea, TimelineDockWidget);
157+
TimelineDockArea->setDockAreaFlag(CDockAreaWidget::eDockAreaFlag::HideSingleWidgetTitleBar, true);
158+
TimelineDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
159+
connect(radioDockTop, &QRadioButton::toggled, [this](bool checked){
160+
bool ok = true;
161+
if(!checked)
162+
{
163+
ok = DockManager->restoreState(kTableBottomLayout.toUtf8());
164+
}
165+
else
166+
{
167+
ok = DockManager->restoreState(kTableTopLayout.toUtf8());
168+
}
169+
if(!ok)
170+
{
171+
QMessageBox msgBox;
172+
msgBox.setText("Failed to apply perspective!");
173+
msgBox.exec();
174+
}
175+
});
176+
177+
QWidget* statusWidget = new QWidget();
178+
QHBoxLayout* statusLayout = new QHBoxLayout(statusWidget);
179+
statusLayout->setSpacing(10);
180+
CDigitalClock* clock = new CDigitalClock(statusWidget);
181+
statusLayout->addWidget(new QLabel("Status Bar"));
182+
QPushButton* OpenPerspectiveButton = new QPushButton("Open Perspective", statusWidget);
183+
connect(OpenPerspectiveButton, &QPushButton::clicked, [this](){
184+
QString PerspectiveName = QFileDialog::getOpenFileName(this, "Open Perspective", "", "Perspective files (*.xml)");
185+
if (PerspectiveName.isEmpty())
186+
{
187+
return;
188+
}
189+
190+
QFile stateFile(PerspectiveName);
191+
stateFile.open(QIODevice::ReadOnly);
192+
QByteArray state = stateFile.readAll();
193+
stateFile.close();
194+
if(!DockManager->restoreState(state))
195+
{
196+
QMessageBox msgBox;
197+
msgBox.setText("Failed to apply perspective " + stateFile.fileName());
198+
msgBox.exec();
199+
}
200+
});
201+
QPushButton* SavePerspectiveButton = new QPushButton("Create Perspective", statusWidget);
202+
connect(SavePerspectiveButton, &QPushButton::clicked, [this](){
203+
QString PerspectiveName = QInputDialog::getText(this, "Save Perspective", "Enter unique name:");
204+
if (PerspectiveName.isEmpty())
205+
{
206+
return;
207+
}
208+
209+
QByteArray state = DockManager->saveState();
210+
QFile stateFile(PerspectiveName + ".xml");
211+
stateFile.open(QIODevice::WriteOnly);
212+
stateFile.write(state);
213+
stateFile.close();
214+
});
215+
statusLayout->addWidget(OpenPerspectiveButton);
216+
statusLayout->addWidget(SavePerspectiveButton);
217+
statusLayout->addStretch(1);
218+
statusLayout->addWidget(clock);
219+
CDockWidget* StatusDockWidget = new CDockWidget("Status");
220+
StatusDockWidget->setWidget(statusWidget);
221+
// StatusDockWidget->setResizeMode(CDockWidget::eResizeMode::ResizeHorizontal);
222+
StatusDockWidget->setFeature(CDockWidget::DockWidgetClosable, false);
223+
StatusDockWidget->setFeature(CDockWidget::DockWidgetMovable, false);
224+
StatusDockWidget->setFeature(CDockWidget::DockWidgetFloatable, false);
225+
StatusDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
226+
StatusDockWidget->setMinimumSize(QSize(50, 50));
227+
StatusDockWidget->setFixedHeight(50);
228+
StatusDockArea = DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, StatusDockWidget);
229+
StatusDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
230+
StatusDockArea->setDockAreaFlag(CDockAreaWidget::eDockAreaFlag::HideSingleWidgetTitleBar, true);
231+
}
232+
233+
CMainWindow::~CMainWindow()
234+
{
235+
delete ui;
236+
}
237+

0 commit comments

Comments
 (0)