Skip to content

Commit 4a8b5dd

Browse files
n-elieklauer
andauthored
Update PyQt bindings (#168)
* Fix include header in sidebar example * Update SIP files and Python examples Co-authored-by: K Lauer <[email protected]> Co-authored-by: K Lauer <[email protected]>
1 parent aa7976d commit 4a8b5dd

File tree

10 files changed

+232
-34
lines changed

10 files changed

+232
-34
lines changed

demo/demo.py

Lines changed: 96 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from PyQt5.QtCore import (QCoreApplication, QDir, Qt, QSettings, QSignalBlocker,
88
QRect, QPoint, qDebug, qInstallMessageHandler,
99
QtDebugMsg, QtInfoMsg, QtWarningMsg,
10-
QtCriticalMsg, QtFatalMsg)
10+
QtCriticalMsg, QtFatalMsg, QSize)
1111
from PyQt5.QtGui import (QGuiApplication, QIcon, QCloseEvent)
1212
from PyQt5.QtWidgets import (QCalendarWidget, QFileSystemModel, QFrame, QLabel,
1313
QMenu, QTreeView, QAction, QWidgetAction,
@@ -25,6 +25,7 @@
2525
from PyQtAds import QtAds
2626

2727
import rc # pyrcc5 demo.qrc -o rc.py
28+
from status_dialog import CStatusDialog
2829

2930
UI_FILE = os.path.join(os.path.dirname(__file__), 'mainwindow.ui')
3031
MainWindowUI, MainWindowBase = uic.loadUiType(UI_FILE)
@@ -100,7 +101,12 @@ def create_calendar_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
100101

101102
dock_widget = QtAds.CDockWidget("Calendar {}".format(_State.calendar_count))
102103
_State.calendar_count += 1
104+
# The following lines are for testing the setWidget() and takeWidget()
105+
# functionality
103106
dock_widget.setWidget(widget)
107+
dock_widget.setWidget(widget) # what happens if we set a widget if a widget is already set
108+
dock_widget.takeWidget() # we remove the widget
109+
dock_widget.setWidget(widget) # and set the widget again - there should be no error
104110
dock_widget.setToggleViewActionMode(QtAds.CDockWidget.ActionModeShow)
105111
dock_widget.setIcon(svg_icon(":/adsdemo/images/date_range.svg"))
106112
view_menu.addAction(dock_widget.toggleViewAction())
@@ -149,9 +155,15 @@ def create_editor_widget(view_menu: QMenu) -> QtAds.CDockWidget:
149155

150156
return dock_widget
151157

158+
class CMinSizeTableWidget(QTableWidget):
159+
"""Custom QTableWidget with a minimum size hint to test CDockWidget
160+
setMinimumSizeHintMode() function of CDockWidget"""
161+
162+
def minimumSizeHint(self) -> QSize:
163+
return QSize(300, 100)
152164

153165
def create_table_widget(view_menu: QMenu) -> QtAds.CDockWidget:
154-
widget = QTableWidget()
166+
widget = CMinSizeTableWidget()
155167
dock_widget = QtAds.CDockWidget("Table {}".format(_State.table_count))
156168
_State.table_count += 1
157169
COLCOUNT = 5
@@ -165,6 +177,15 @@ def create_table_widget(view_menu: QMenu) -> QtAds.CDockWidget:
165177

166178
dock_widget.setWidget(widget)
167179
dock_widget.setIcon(svg_icon(":/adsdemo/images/grid_on.svg"))
180+
dock_widget.setMinimumSizeHintMode(QtAds.CDockWidget.MinimumSizeHintFromContent)
181+
toolbar = dock_widget.createDefaultToolBar()
182+
action = toolbar.addAction(svg_icon(":/adsdemo/images/fullscreen.svg"), "Toggle Fullscreen")
183+
def on_toggle_fullscreen():
184+
if dock_widget.isFullScreen():
185+
dock_widget.showNormal()
186+
else:
187+
dock_widget.showFullScreen()
188+
action.triggered.connect(on_toggle_fullscreen)
168189
view_menu.addAction(dock_widget.toggleViewAction())
169190
return dock_widget
170191

@@ -179,7 +200,7 @@ def create_activex_widget(view_menu: QMenu, parent: QWidget = None) -> QtAds.CDo
179200
return dock_widget
180201

181202

182-
class CustomComponentsFactory(QtAds.CDockComponentsFactory):
203+
class CCustomComponentsFactory(QtAds.CDockComponentsFactory):
183204

184205
def createDockAreaTitleBar(self, dock_area: QtAds.CDockAreaWidget) -> QtAds.CDockAreaTitleBar:
185206
title_bar = QtAds.CDockAreaTitleBar(dock_area)
@@ -192,7 +213,6 @@ def createDockAreaTitleBar(self, dock_area: QtAds.CDockAreaWidget) -> QtAds.CDoc
192213
return title_bar
193214

194215

195-
196216
class MainWindow(MainWindowUI, MainWindowBase):
197217
save_perspective_action: QAction
198218
perspective_list_action: QWidgetAction
@@ -213,13 +233,39 @@ def __init__(self, parent=None):
213233
# a QToolButton instead of a QPushButton
214234
# QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.configFlags() | QtAds.CDockManager.TabCloseButtonIsToolButton)
215235

236+
# uncomment the following line if you want to use opaque undocking and
237+
# opaque splitter resizing
238+
#QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.DefaultOpaqueConfig);
239+
216240
# uncomment the following line if you want a fixed tab width that does
217241
# not change if the visibility of the close button changes
218-
# QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.RetainTabSizeWhenCloseButtonHidden, True)
242+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.RetainTabSizeWhenCloseButtonHidden, True)
243+
244+
# uncomment the following line if you don't want close button on DockArea's title bar
245+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasCloseButton, false);
246+
247+
# uncomment the following line if you don't want undock button on DockArea's title bar
248+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasUndockButton, false);
249+
250+
# uncomment the following line if you don't want tabs menu button on DockArea's title bar
251+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasTabsMenuButton, false);
219252

220-
# uncomment the follwing line if you want to use non opaque undocking and splitter
221-
# movements
222-
# QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.DefaultNonOpaqueConfig)
253+
# uncomment the following line if you don't want disabled buttons to appear on DockArea's title bar
254+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHideDisabledButtons, true);
255+
256+
# uncomment the following line if you want to show tabs menu button on DockArea's title bar only when there are more than one tab and at least of them has elided title
257+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaDynamicTabsMenuButtonVisibility, true);
258+
259+
# uncomment the following line if you want floating container to always show application title instead of active dock widget's title
260+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FloatingContainerHasWidgetTitle, false);
261+
262+
# uncomment the following line if you want floating container to show active dock widget's icon instead of always showing application icon
263+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FloatingContainerHasWidgetIcon, true);
264+
265+
# uncomment the following line if you want a central widget in the main dock container (the dock manager) without a titlebar
266+
# If you enable this code, you can test it in the demo with the Calendar 0
267+
# dock widget.
268+
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.HideSingleCentralWidgetTitleBar, true);
223269

224270
# Now create the dock manager and its content
225271
self.dock_manager = QtAds.CDockManager(self)
@@ -245,8 +291,6 @@ def create_content(self):
245291
view_menu = self.menuView
246292
dock_widget = create_calendar_dock_widget(view_menu)
247293
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetClosable, False)
248-
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetMovable, False)
249-
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetFloatable, False)
250294
special_dock_area = self.dock_manager.addDockWidget(QtAds.LeftDockWidgetArea, dock_widget)
251295

252296
# For this Special Dock Area we want to avoid dropping on the center of it (i.e. we don't want this widget to be ever tabbified):
@@ -271,18 +315,13 @@ def create_content(self):
271315
append_feature_string_to_window_title(file_system_widget)
272316

273317
# Test custom factory - we inject a help button into the title bar
274-
self.factory = CustomComponentsFactory()
275-
QtAds.CDockComponentsFactory.setFactory(self.factory)
318+
QtAds.CDockComponentsFactory.setFactory(CCustomComponentsFactory())
276319
top_dock_area = self.dock_manager.addDockWidget(QtAds.TopDockWidgetArea, file_system_widget)
277320
QtAds.CDockComponentsFactory.resetDefaultFactory()
278321

279-
280322
# We create a calendar widget and clear all flags to prevent the dock area
281323
# from closing
282324
dock_widget = create_calendar_dock_widget(view_menu)
283-
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetClosable, False)
284-
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetMovable, False)
285-
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetFloatable, False)
286325
dock_widget.setTabToolTip("Tab ToolTip\nHodie est dies magna")
287326
dock_area = self.dock_manager.addDockWidget(QtAds.CenterDockWidgetArea, dock_widget, top_dock_area)
288327

@@ -292,6 +331,7 @@ def create_content(self):
292331
custom_button.setToolTip("Create Editor")
293332
custom_button.setIcon(svg_icon(":/adsdemo/images/plus.svg"))
294333
custom_button.setAutoRaise(True)
334+
295335
title_bar = dock_area.titleBar()
296336
index = title_bar.indexOf(title_bar.tabBar())
297337
title_bar.insertWidget(index + 1, custom_button)
@@ -309,7 +349,7 @@ def on_button_clicked():
309349
self.dock_manager.addDockWidget(
310350
QtAds.TopDockWidgetArea,
311351
create_long_text_label_dock_widget(view_menu), right_dock_area)
312-
352+
313353
bottom_dock_area = self.dock_manager.addDockWidget(
314354
QtAds.BottomDockWidgetArea,
315355
create_long_text_label_dock_widget(view_menu), right_dock_area)
@@ -320,9 +360,14 @@ def on_button_clicked():
320360
self.dock_manager.addDockWidget(
321361
QtAds.CenterDockWidgetArea,
322362
create_long_text_label_dock_widget(view_menu), bottom_dock_area)
323-
324-
action = self.menuView.addAction("Set {} floating".format(dock_widget.windowTitle()))
363+
364+
365+
action = self.menuTests.addAction("Set {} Floating".format(dock_widget.windowTitle()))
325366
action.triggered.connect(dock_widget.setFloating)
367+
action = self.menuTests.addAction("Set {} As Current Tab".format(dock_widget.windowTitle()))
368+
action.triggered.connect(dock_widget.setAsCurrentTab)
369+
action = self.menuTests.addAction("Raise {}".format(dock_widget.windowTitle()))
370+
action.triggered.connect(dock_widget.raise_)
326371

327372
if ACTIVEX_AVAILABLE:
328373
flags = self.dock_manager.configFlags()
@@ -353,25 +398,40 @@ def create_actions(self):
353398
self.toolBar.addAction(self.perspective_list_action)
354399
self.toolBar.addAction(self.save_perspective_action)
355400

356-
a = self.toolBar.addAction("Create Editor")
401+
a = self.toolBar.addAction("Create Floating Editor")
402+
a.setProperty("Floating", True)
357403
a.setToolTip("Creates floating dynamic dockable editor windows that are deleted on close")
358404
a.setIcon(svg_icon(":/adsdemo/images/note_add.svg"))
359405
a.triggered.connect(self.create_editor)
406+
self.menuTests.addAction(a)
407+
408+
a = self.toolBar.addAction("Create Docked Editor")
409+
a.setProperty("Floating", False)
410+
a.setToolTip("Creates a docked editor windows that are deleted on close")
411+
a.setIcon(svg_icon(":/adsdemo/images/docked_editor.svg"))
412+
a.triggered.connect(self.create_editor)
413+
self.menuTests.addAction(a)
360414

361-
a = self.toolBar.addAction("Create Table")
415+
a = self.toolBar.addAction("Create Floating Table")
362416
a.setToolTip("Creates floating dynamic dockable table with millions of entries")
363417
a.setIcon(svg_icon(":/adsdemo/images/grid_on.svg"))
364418
a.triggered.connect(self.create_table)
419+
self.menuTests.addAction(a)
420+
421+
self.menuTests.addSeparator()
422+
a = self.menuTests.addAction("Show Status Dialog")
423+
a.triggered.connect(self.show_status_dialog)
424+
self.menuTests.addSeparator()
365425

366426
def closeEvent(self, event: QCloseEvent):
367427
self.save_state()
368428
super().closeEvent(event)
369429

370-
def on_action_save_state_triggered(state: bool):
430+
def on_actionSaveState_triggered(self, state: bool):
371431
qDebug("MainWindow::on_action_save_state_triggered")
372432
self.save_state()
373433

374-
def on_action_restore_state_triggered(state: bool):
434+
def on_actionRestoreState_triggered(self, state: bool):
375435
qDebug("MainWindow::on_action_restore_state_triggered")
376436
self.restore_state()
377437

@@ -403,11 +463,18 @@ def on_view_visibility_changed(self, visible: bool):
403463
qDebug("{} visibility_changed({})".format(dock_widget.objectName(), visible))
404464

405465
def create_editor(self):
466+
sender = self.sender()
467+
floating = sender.property("Floating")
468+
print("Floating:", floating)
406469
dock_widget = create_editor_widget(self.menuView)
407470
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
408-
floating_widget = self.dock_manager.addDockWidgetFloating(dock_widget)
409-
floating_widget.move(QPoint(20, 20))
410471
dock_widget.closeRequested.connect(self.on_editor_close_requested)
472+
473+
if floating:
474+
floating_widget = self.dock_manager.addDockWidgetFloating(dock_widget)
475+
floating_widget.move(QPoint(20, 20))
476+
else:
477+
self.dock_manager.addDockWidget(QtAds.TopDockWidgetArea, dock_widget)
411478

412479
def on_editor_close_requested(self):
413480
dock_widget = self.sender()
@@ -421,6 +488,10 @@ def create_table(self):
421488
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
422489
floating_widget = self.dock_manager.addDockWidgetFloating(dock_widget)
423490
floating_widget.move(QPoint(40, 40))
491+
492+
def show_status_dialog(self):
493+
dialog = CStatusDialog(self.dock_manager)
494+
dialog.exec_()
424495

425496
def save_state(self):
426497
'''

demo/status_dialog.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import os
2+
import sys
3+
4+
from PyQt5 import uic
5+
from PyQtAds import QtAds
6+
7+
UI_FILE = os.path.join(os.path.dirname(__file__), 'StatusDialog.ui')
8+
StatusDialogUI, StatusDialogBase = uic.loadUiType(UI_FILE)
9+
10+
class CStatusDialog(StatusDialogUI, StatusDialogBase):
11+
12+
def __init__(self, dock_manager: QtAds.CDockManager, parent=None):
13+
super().__init__(parent)
14+
15+
self.setupUi(self)
16+
17+
self.dock_manager = dock_manager
18+
self.dock_widgets = self.dock_manager.dockWidgetsMap()
19+
20+
for key, widget in self.dock_widgets.items():
21+
self.dockWidgetsComboBox.addItem(key, widget)
22+
23+
def on_dockWidgetsComboBox_currentIndexChanged(self, index: int):
24+
if not isinstance(index, int):
25+
return
26+
if index < 0:
27+
return
28+
29+
dock_widget = self.dockWidgetsComboBox.currentData()
30+
self.isClosedCheckBox.setChecked(dock_widget.isClosed())
31+
self.isFloatingCheckBox.setChecked(dock_widget.isFloating())
32+
self.tabbedCheckBox.setChecked(dock_widget.isTabbed())
33+
self.isCurrentTabCheckBox.setChecked(dock_widget.isCurrentTab())
34+
self.closableCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetClosable)
35+
self.movableCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetMovable)
36+
self.floatableCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetFloatable)
37+
self.deleteOnCloseCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetDeleteOnClose)
38+
self.customCloseHandlingCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.CustomCloseHandling)

examples/sidebar/MainWindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "../../examples/simple/MainWindow.h"
1+
#include "MainWindow.h"
22

33
#include "ui_MainWindow.h"
44

examples/sidebar/sidebar.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import os
2+
import sys
3+
4+
from PyQt5 import uic
5+
from PyQt5.QtCore import Qt, QMargins
6+
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QPlainTextEdit
7+
8+
from PyQtAds import QtAds
9+
10+
UI_FILE = os.path.join(os.path.dirname(__file__), 'MainWindow.ui')
11+
MainWindowUI, MainWindowBase = uic.loadUiType(UI_FILE)
12+
13+
14+
class MainWindow(MainWindowUI, MainWindowBase):
15+
16+
def __init__(self, parent=None):
17+
super().__init__(parent)
18+
19+
self.setupUi(self)
20+
21+
# Create the dock manager. Because the parent parameter is a QMainWindow
22+
# the dock manager registers itself as the central widget.
23+
layout = QVBoxLayout(self.dockContainer);
24+
layout.setContentsMargins(QMargins(0, 0, 0, 0))
25+
self.dock_manager = QtAds.CDockManager(self.dockContainer)
26+
layout.addWidget(self.dock_manager)
27+
28+
# Create example content label - this can be any application specific
29+
# widget
30+
l = QLabel()
31+
l.setWordWrap(True)
32+
l.setAlignment(Qt.AlignTop | Qt.AlignLeft);
33+
l.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. ")
34+
35+
# Create a dock widget with the title Label 1 and set the created label
36+
# as the dock widget content
37+
dock_widget = QtAds.CDockWidget("Label 1")
38+
dock_widget.setWidget(l)
39+
40+
# Add the toggleViewAction of the dock widget to the menu to give
41+
# the user the possibility to show the dock widget if it has been closed
42+
self.menuView.addAction(dock_widget.toggleViewAction())
43+
44+
# Add the dock widget to the top dock widget area
45+
self.dock_manager.addDockWidget(QtAds.TopDockWidgetArea, dock_widget)
46+
47+
# Create an example editor
48+
te = QPlainTextEdit()
49+
te.setPlaceholderText("Please enter your text here into this QPlainTextEdit...")
50+
dock_widget = QtAds.CDockWidget("Editor 1")
51+
self.menuView.addAction(dock_widget.toggleViewAction())
52+
self.dock_manager.addDockWidget(QtAds.BottomDockWidgetArea, dock_widget)
53+
54+
55+
if __name__ == '__main__':
56+
app = QApplication(sys.argv)
57+
58+
w = MainWindow()
59+
w.show()
60+
app.exec_()

examples/simple/simple.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import datetime
2-
import logging
31
import os
42
import sys
53

0 commit comments

Comments
 (0)