Skip to content

Commit f6174fa

Browse files
Merge pull request #71 from metgem/master
Add PyQt5 bindings
2 parents 53fed8b + 5752bfb commit f6174fa

23 files changed

+2426
-1
lines changed

.gitignore

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
*.pro.user
2-
/ build
2+
/build
33
*.o
44
*.dylib
55
*.app
@@ -10,3 +10,9 @@ Makefile
1010

1111
# IDEs
1212
.idea
13+
14+
# Python
15+
.eggs
16+
*.pyc
17+
*.pyd
18+
__pycache__

PyQtAds/QtAds/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from .ads import ads
2+
from ._version import *
3+
4+
import inspect
5+
6+
for name, member in inspect.getmembers(ads):
7+
if not name.startswith('_'):
8+
globals()[name] = member
9+
10+
del ads

PyQtAds/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .rc import *

PyQtAds/_version.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# THIS FILE IS GENERATED FROM PyQtAds SETUP.PY
2+
3+
short_version = '2.5.1'
4+
version = '2.5.1'
5+
full_version = '2.5.1'
6+
git_revision = 'c10ff7c688fb50fe9157bad3982164e0f955f9e4'
7+
release = True
8+
if not release:
9+
version = full_version

PyQtAds/rc.py

Lines changed: 670 additions & 0 deletions
Large diffs are not rendered by default.

demo.py

Lines changed: 316 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,316 @@
1+
import datetime
2+
import logging
3+
4+
from PyQt5.QtCore import (QCoreApplication, QDir, Qt, QSettings, QSignalBlocker,
5+
QRect)
6+
from PyQt5.QtGui import QGuiApplication
7+
from PyQt5.QtWidgets import (QCalendarWidget, QFileSystemModel, QFrame, QLabel,
8+
QMenu, QTreeView, QAction, QWidgetAction,
9+
QComboBox, QStyle, QSizePolicy, QInputDialog)
10+
11+
from PyQt5 import QtWidgets
12+
13+
from PyQtAds import QtAds
14+
15+
16+
class _State:
17+
label_count = 0
18+
calendar_count = 0
19+
file_system_count = 0
20+
21+
22+
def create_long_text_label_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
23+
'''
24+
Create long text label dock widget
25+
26+
Parameters
27+
----------
28+
view_menu : QMenu
29+
30+
Returns
31+
-------
32+
value : QtAds.CDockWidget
33+
'''
34+
label = QLabel()
35+
label.setWordWrap(True)
36+
label.setAlignment(Qt.AlignTop | Qt.AlignLeft)
37+
label.setText('''\
38+
Label {} {} - Lorem ipsum dolor sit amet, consectetuer
39+
adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum
40+
sociis natoque penatibus et magnis dis parturient montes, nascetur
41+
ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium
42+
quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla
43+
vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
44+
imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis
45+
pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi.
46+
Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu,
47+
consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra
48+
quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet.
49+
'''.format(_State.label_count, str(datetime.datetime.now())))
50+
_State.label_count += 1
51+
52+
dock_widget = QtAds.CDockWidget("Label {}".format(_State.label_count))
53+
dock_widget.setWidget(label)
54+
55+
view_menu.addAction(dock_widget.toggleViewAction())
56+
return dock_widget
57+
58+
59+
def create_calendar_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
60+
'''
61+
Create calendar dock widget
62+
63+
Parameters
64+
----------
65+
view_menu : QMenu
66+
67+
Returns
68+
-------
69+
value : QtAds.CDockWidget
70+
'''
71+
widget = QCalendarWidget()
72+
73+
dock_widget = QtAds.CDockWidget("Calendar {}".format(_State.calendar_count))
74+
_State.calendar_count += 1
75+
dock_widget.setWidget(widget)
76+
dock_widget.setToggleViewActionMode(QtAds.CDockWidget.ActionModeShow)
77+
view_menu.addAction(dock_widget.toggleViewAction())
78+
return dock_widget
79+
80+
81+
def create_file_system_tree_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
82+
'''
83+
Create file system tree dock widget
84+
85+
Parameters
86+
----------
87+
view_menu : QMenu
88+
89+
Returns
90+
-------
91+
value : QtAds.CDockWidget
92+
'''
93+
widget = QTreeView()
94+
widget.setFrameShape(QFrame.NoFrame)
95+
96+
m = QFileSystemModel(widget)
97+
m.setRootPath(QDir.currentPath())
98+
widget.setModel(m)
99+
100+
dock_widget = QtAds.CDockWidget("Filesystem {}".format(_State.file_system_count))
101+
_State.file_system_count += 1
102+
dock_widget.setWidget(widget)
103+
view_menu.addAction(dock_widget.toggleViewAction())
104+
return dock_widget
105+
106+
107+
class MainWindow(QtWidgets.QMainWindow):
108+
save_perspective_action: QAction
109+
perspective_list_action: QWidgetAction
110+
perspective_combo_box: QComboBox
111+
dock_manager: QtAds.CDockManager
112+
113+
def __init__(self, parent=None):
114+
super().__init__(parent)
115+
self.save_perspective_action = None
116+
self.perspective_list_action = None
117+
self.perspective_combo_box = None
118+
self.dock_manager = None
119+
120+
self.setup_ui()
121+
122+
self.dock_manager = QtAds.CDockManager(self)
123+
self.perspective_combo_box.activated[str].connect(self.dock_manager.openPerspective)
124+
self.create_content()
125+
self.resize(800, 600)
126+
self.restore_state()
127+
self.restore_perspectives()
128+
129+
def setup_ui(self):
130+
self.setObjectName("MainWindow")
131+
self.resize(400, 300)
132+
self.setDockOptions(QtWidgets.QMainWindow.AllowTabbedDocks)
133+
self.centralWidget = QtWidgets.QWidget(self)
134+
self.centralWidget.setObjectName("centralWidget")
135+
self.setCentralWidget(self.centralWidget)
136+
self.status_bar = QtWidgets.QStatusBar(self)
137+
self.status_bar.setObjectName("statusBar")
138+
self.setStatusBar(self.status_bar)
139+
self.menu_bar = QtWidgets.QMenuBar(self)
140+
self.menu_bar.setGeometry(QRect(0, 0, 400, 21))
141+
self.menu_bar.setObjectName("menuBar")
142+
self.menu_file = QtWidgets.QMenu(self.menu_bar)
143+
self.menu_file.setObjectName("menuFile")
144+
self.menu_view = QtWidgets.QMenu(self.menu_bar)
145+
self.menu_view.setObjectName("menuView")
146+
self.menu_about = QtWidgets.QMenu(self.menu_bar)
147+
self.menu_about.setObjectName("menuAbout")
148+
self.setMenuBar(self.menu_bar)
149+
self.tool_bar = QtWidgets.QToolBar(self)
150+
self.tool_bar.setObjectName("toolBar")
151+
self.addToolBar(Qt.TopToolBarArea, self.tool_bar)
152+
self.action_exit = QtWidgets.QAction(self)
153+
self.action_exit.setObjectName("actionExit")
154+
self.action_save_state = QtWidgets.QAction(self)
155+
self.action_save_state.setObjectName("actionSaveState")
156+
self.action_save_state.triggered.connect(self.saveState)
157+
158+
self.action_restore_state = QtWidgets.QAction(self)
159+
self.action_restore_state.setObjectName("actionRestoreState")
160+
self.action_restore_state.triggered.connect(self.restore_state)
161+
162+
self.menu_file.addAction(self.action_exit)
163+
self.menu_file.addAction(self.action_save_state)
164+
self.menu_file.addAction(self.action_restore_state)
165+
self.menu_bar.addAction(self.menu_file.menuAction())
166+
self.menu_bar.addAction(self.menu_view.menuAction())
167+
self.menu_bar.addAction(self.menu_about.menuAction())
168+
169+
self.setWindowTitle("MainWindow")
170+
self.menu_file.setTitle("File")
171+
self.menu_view.setTitle("View")
172+
self.menu_about.setTitle("About")
173+
self.tool_bar.setWindowTitle("toolBar")
174+
self.action_exit.setText("Exit")
175+
self.action_save_state.setText("Save State")
176+
self.action_restore_state.setText("Restore State")
177+
self.create_actions()
178+
179+
def create_actions(self):
180+
'''
181+
Creates the toolbar actions
182+
'''
183+
self.tool_bar.addAction(self.action_save_state)
184+
self.action_save_state.setIcon(self.style().standardIcon(QStyle.SP_DialogSaveButton))
185+
self.tool_bar.addAction(self.action_restore_state)
186+
self.action_restore_state.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton))
187+
self.save_perspective_action = QAction("Save Perspective", self)
188+
self.save_perspective_action.triggered.connect(self.save_perspective)
189+
190+
self.perspective_list_action = QWidgetAction(self)
191+
self.perspective_combo_box = QComboBox(self)
192+
self.perspective_combo_box.setSizeAdjustPolicy(QComboBox.AdjustToContents)
193+
self.perspective_combo_box.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
194+
self.perspective_list_action.setDefaultWidget(self.perspective_combo_box)
195+
self.tool_bar.addSeparator()
196+
self.tool_bar.addAction(self.perspective_list_action)
197+
self.tool_bar.addAction(self.save_perspective_action)
198+
199+
def create_content(self):
200+
'''
201+
Fill the dock manager with dock widgets
202+
'''
203+
# Test container docking
204+
view_menu = self.menu_view
205+
dock_widget = create_calendar_dock_widget(view_menu)
206+
dock_widget.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton))
207+
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetClosable, False)
208+
self.dock_manager.addDockWidget(QtAds.LeftDockWidgetArea, dock_widget)
209+
self.dock_manager.addDockWidget(QtAds.LeftDockWidgetArea, create_long_text_label_dock_widget(view_menu))
210+
file_system_widget = create_file_system_tree_dock_widget(view_menu)
211+
tool_bar = file_system_widget.createDefaultToolBar()
212+
tool_bar.addAction(self.action_save_state)
213+
tool_bar.addAction(self.action_restore_state)
214+
self.dock_manager.addDockWidget(QtAds.BottomDockWidgetArea, file_system_widget)
215+
file_system_widget = create_file_system_tree_dock_widget(view_menu)
216+
tool_bar = file_system_widget.createDefaultToolBar()
217+
tool_bar.addAction(self.action_save_state)
218+
tool_bar.addAction(self.action_restore_state)
219+
file_system_widget.setFeature(QtAds.CDockWidget.DockWidgetMovable, False)
220+
top_dock_area = self.dock_manager.addDockWidget(QtAds.TopDockWidgetArea, file_system_widget)
221+
dock_widget = create_calendar_dock_widget(view_menu)
222+
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetClosable, False)
223+
dock_widget.setTabToolTip("Tab ToolTip\nHodie est dies magna")
224+
self.dock_manager.addDockWidget(QtAds.CenterDockWidgetArea, dock_widget, top_dock_area)
225+
226+
# Test dock area docking
227+
right_dock_area = self.dock_manager.addDockWidget(
228+
QtAds.RightDockWidgetArea,
229+
create_long_text_label_dock_widget(view_menu), top_dock_area)
230+
self.dock_manager.addDockWidget(
231+
QtAds.TopDockWidgetArea,
232+
create_long_text_label_dock_widget(view_menu), right_dock_area)
233+
234+
bottom_dock_area = self.dock_manager.addDockWidget(
235+
QtAds.BottomDockWidgetArea,
236+
create_long_text_label_dock_widget(view_menu), right_dock_area)
237+
238+
self.dock_manager.addDockWidget(
239+
QtAds.RightDockWidgetArea,
240+
create_long_text_label_dock_widget(view_menu), right_dock_area)
241+
self.dock_manager.addDockWidget(
242+
QtAds.CenterDockWidgetArea,
243+
create_long_text_label_dock_widget(view_menu), bottom_dock_area)
244+
245+
def save_state(self):
246+
'''
247+
Saves the dock manager state and the main window geometry
248+
'''
249+
settings = QSettings("Settings.ini", QSettings.IniFormat)
250+
settings.setValue("mainWindow/Geometry", self.saveGeometry())
251+
settings.setValue("mainWindow/State", self.saveState())
252+
settings.setValue("mainWindow/DockingState", self.dock_manager.saveState())
253+
254+
def save_perspectives(self):
255+
'''
256+
Save the list of perspectives
257+
'''
258+
settings = QSettings("Settings.ini", QSettings.IniFormat)
259+
self.dock_manager.savePerspectives(settings)
260+
261+
def restore_state(self):
262+
'''
263+
Restores the dock manager state
264+
'''
265+
settings = QSettings("Settings.ini", QSettings.IniFormat)
266+
geom = settings.value("mainWindow/Geometry")
267+
if geom is not None:
268+
self.restoreGeometry(geom)
269+
270+
state = settings.value("mainWindow/State")
271+
if state is not None:
272+
self.restoreState(state)
273+
274+
state = settings.value("mainWindow/DockingState")
275+
if state is not None:
276+
self.dock_manager.restore_state(state)
277+
278+
def restore_perspectives(self):
279+
'''
280+
Restore the perspective listo of the dock manager
281+
'''
282+
settings = QSettings("Settings.ini", QSettings.IniFormat)
283+
self.dock_manager.loadPerspectives(settings)
284+
self.perspective_combo_box.clear()
285+
self.perspective_combo_box.addItems(self.dock_manager.perspectiveNames())
286+
287+
def save_perspective(self):
288+
perspective_name, ok = QInputDialog.getText(self, 'Save perspective', 'Enter unique name:')
289+
if ok and perspective_name:
290+
self.dock_manager.addPerspective(perspective_name)
291+
_ = QSignalBlocker(self.perspective_combo_box)
292+
self.perspective_combo_box.clear()
293+
self.perspective_combo_box.addItems(self.dock_manager.perspectiveNames())
294+
self.perspective_combo_box.setCurrentText(perspective_name)
295+
self.save_perspectives()
296+
297+
298+
def main(app_):
299+
main_window = MainWindow()
300+
main_window.show()
301+
state = main_window.dock_manager.saveState()
302+
# print('This is what the saved state looks like in XML:')
303+
# print(str(state, 'utf-8'))
304+
# print()
305+
# main_window.dock_manager.restore_state(state)
306+
return main_window
307+
308+
309+
if __name__ == '__main__':
310+
# logging.basicConfig(level='DEBUG')
311+
QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
312+
QGuiApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
313+
app = QtWidgets.QApplication([])
314+
window = main(app)
315+
window.show()
316+
app.exec_()

0 commit comments

Comments
 (0)